【问题标题】:Different ASCII symbols/characters considered equal by LinqToSQLLinqToSQL 认为相同的不同 ASCII 符号/字符
【发布时间】:2012-09-06 13:17:41
【问题描述】:

我刚刚发现在 LinqPad 中运行查询时出现了一些奇怪的行为。似乎某些 ASCII 符号/字符被 LinqToSQL 认为是相等的,而实际上它们并非如此。

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

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};

有什么想法吗?

【问题讨论】:

  • 理解这些是不是 ASCII字符是很重要的(为了交流的目的)。术语“扩展 ASCII”也没有任何明确定义的含义。它通常表示“某种编码,通常是 8 位,与 ASCII 中定义的字符的 ASCII 字符编码兼容”。

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


【解决方案1】:

您看到的差异是由于 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。您应该会看到返回的相同的额外记录。您可能需要调整排序规则设置或其他特定于数据库的设置才能在此查询中获得正确的行为。

【讨论】:

  • Okej,我可能会在有时间的时候深入研究数据库设置。现在我想我会使用 .ToList() 解决方法。不过还是谢谢你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多