我刚刚发现了一些在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};
任何想法是如何产生的?
答案 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。您应该看到返回的相同额外记录。您可能需要调整排序规则设置或其他特定于数据库的设置,以便在此查询中获得正确的行为。