Linq To SQL认为不同的ASCII符号/字符相同

时间:2012-09-06 13:17:41

标签: linq-to-sql special-characters extended-ascii

我刚刚发现了一些在LinqPad中运行查询的奇怪行为。似乎LinqToSQL认为某些ASCII符号/字符实际上不相同。

考虑以下类(带有相应的表):

public class SpecialCharacter
{
    int Id;
    string Character;
    string Name;
}

如果在表中为“⇒”(右箭头)和“⇐”(左箭头)添加一行,则以下查询将告诉您它们是相等的(结果将包含两个项目):

var result = from a in SpecialCharacters
             from b in SpecialCharacters
             where a.Character == b.Character  && a != b
             select new {A = a, B = b};

通过添加对.ToList()的调用来更改查询将导致预期的行为(结果为空):

var result = from a in SpecialCharacters.ToList()
             from b in SpecialCharacters.ToList()
             where a.Character == b.Character && a != b
             select new {A = a, B = b};

任何想法是如何产生的?

1 个答案:

答案 0 :(得分:0)

您看到的差异是由于LINQ处理相等性和SQL Server的排序规则设置之间的差异。如果你做了区分大小写的搜索,你会看到同样的事情。 LINQ to Objects。请考虑以下查询:

var query = from c in Customers
            where c.City == "london"
            select c;

LINQ to Objects将匹配伦敦的城市,但不匹配伦敦或伦敦。另一方面,LINQ to SQL或EF将默认匹配这三者中的任何一个,因为它不区分大小写。您可能希望通过检查result.ToString来检查生成的SQL,然后在SSMS中直接运行该SQL,从而检查LINQ to SQL中生成的TSQL。您应该看到返回的相同额外记录。您可能需要调整排序规则设置或其他特定于数据库的设置,以便在此查询中获得正确的行为。