0

我刚刚发现在 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};

任何想法这是怎么回事?

4

1 回答 1

0

您看到的差异是由于 LINQ 处理相等性的方式与 SQL Server 的排序规则设置之间的差异。如果您进行区分大小写的搜索,您会看到同样的结果。LINQ 到对象。考虑以下查询:

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

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

于 2012-09-06T13:33:08.683 回答