[Linq To Sql]解决join时的Collation冲突
背景
现在两表
A:
B:
如果尝试进行join操作则会报错:
分析
由于两表字段排序规则不一样,造成表连接时无法比较,从而抛出异常。如果用sql语句,只用显示指明Collation即可()。经查阅,目前EF尚没有提 供可以在代码中显式指明Collation的方式。目前我能想到的变通的方式有(假设想改变客户的数据库设置是不可能的):
1用Cross Join. (From a in tablea from b in tableb where a.Key==b.Key ...)
2用select ... where id in (select ...)的方式
3对要接连的字段(varchar)进行计算,如substring看看能否改变其性质
4对要接连的字段进行转换(如果全是编码,可以尝试转成int类型),再进行比对,看能否绕过排序规则
5使用EF API ExecuteQuery方法直接使用Sql语句进行查询
6实在不行,就只能先全部取出数据,然后在本地进行处理了。
解决
方式1-3全部无法绕过排序规则,具体步骤就不截图了。
方式4,在Linq To Sql中要将string转换成int(业务上这些字段可能是纯数字组成的流水号),使用Convert.ToInt32是不行的(虽然在Linq Pad中被支持,但vs中不行)。必须使用SqlFunctions或EntityFunctions之类的方法。
不幸的是,我在这些API中并没有找到可以将string cast为int的方法。幸运的是,sqlFunctions提供了一个CheckSum方法,用以计算string或其它类型的哈希值。通过哈希值相等判断两个string相等可靠么?答案是,比较可靠。
试试看,很好:
后话
貌似sqlserver 2012解决了这个不便, 有兴趣可以试试。