使用 LINQ to SQL 的奇怪排序问题

Posted

技术标签:

【中文标题】使用 LINQ to SQL 的奇怪排序问题【英文标题】:Strange collation issue using LINQ to SQL 【发布时间】:2011-07-31 09:37:38 【问题描述】:

我在 LINQ-SQL 中遇到了最奇怪的排序规则错误。我有这个查询,它对 2 个参数执行左外连接。从查询中,如果它不为空,我想为左连接表提取一列,否则从第一个表中提取。有问题的字段是 char,并且两个表具有相同的排序规则。 LINQ 代码如下所示,我已将导致错误的行加粗。

from contentList in dc.ContentList  
   join portalPriceClass in dc.PortalContentPriceClass  
   on contentList.ContentID equals portalPriceClass.ContentID  
   into ppc 
from portalSpecificPriceClass in ppc.Where(portalPriceClass => 
   portalPriceClass.PortalID==portalId).DefaultIfEmpty()  
where contentListPriority.PortalID == portalId  
select new  
  
   ID = content.ID,  
   PriceClass = (portalSpecificPriceClass == null) ? contentGame.PriceClass : portalSpecificPriceClass.PriceClass 
; 

很遗憾,我收到以下错误,但找不到任何原因:

System.Data.SqlClient.SqlException:无法执行 char 值到 char 的隐式转换,因为值的排序规则由于排序规则冲突而未解决。

【问题讨论】:

【参考方案1】:

能否请您使用 sp_help 检查您的表格以查看列中是否存在不同的排序规则。

关于这个问题也有非常透彻的解释here

【讨论】:

【参考方案2】:

您可以使查询更容易一些,并避免该问题,我认为这应该“有效”:

from a in dc.ContentList
where a.ContentID != null
select new  ID = a.ContentID, a.PriceClass, .. ).Union(
    from b in dc.ContentList
    where dc.ContentList.FirstOrDefault(a => a.ContentID == b.ContentID) == null)
    select new  ID = b.ContentID, b.PriceClass, .. );

【讨论】:

以上是关于使用 LINQ to SQL 的奇怪排序问题的主要内容,如果未能解决你的问题,请参考以下文章

Linq-to-sql 不产生多个外连接?

如何轻松地重新排序 LINQ to SQL 设计器中的列?

使用 Linq-to-SQL 的 ADO.NET 数据服务

Linq to SQL - 如何将数字作为字符串排序?

Linq-to-SQL 超时

Linq-to-SQL 和 DateTime 的怪异