[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解决了这个不便, 有兴趣可以试试。

posted @ 2014-10-15 14:02  Caption  阅读(374)  评论(0编辑  收藏  举报