使用 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 的奇怪排序问题的主要内容,如果未能解决你的问题,请参考以下文章