【问题标题】:Linq/SQL Returning Different ResultsLinq/SQL 返回不同的结果
【发布时间】:2018-11-28 17:08:57
【问题描述】:

我很好奇为什么我的 linq group by 查询返回 417 结果而我的 SQL 解释返回 419?我正在从我的列表中查找重复的电子邮件。我检查了结果集,linq 集中缺少的两个电子邮件地址都有重音符号。 linq 不识别口音吗?有解决方法吗?电子邮件字段类型是 nvarchar(100)。

如果您有任何问题,请告诉我, 提前致谢!

var listOfContacts = (from contacts in something
                      where contacts.Team.Id.Equals(TeamGuid) && !contacts.Email.Equals(null)
                      select new {contacts.Id, EmailAddress = contacts.Email.ToLower()}).ToList();

//Full Contact List; exact amount matches

var dupeEmailsList = listOfContacts
    .GroupBy(x => x.EmailAddress)
    .Where(g => g.Count() > 1)
    .Select(y => y.Key)
    .ToList();

//Returns 417
SELECT Email, COUNT(*)
FROM something
WHERE Team = 'Actual Team Guid Inserted Here'
GROUP BY Email
HAVING (COUNT(LOWER(Email)) > 1 AND Email IS NOT NULL)
ORDER BY Email

//Returns 419

【问题讨论】:

  • 身份证号可能有误。您的 linq 正在查看 ID 号,而 SQL 正在查看“TeamGuid”名称。
  • @stuartd, Latin1_General_CI_AI
  • @jdweng,我添加了 Team Guid 作为占位符,让我编辑以显示假 guid
  • LINQ 使用 SQL 处理查询 - 您可以删除 ToList 并执行 ToString 以查看 SQL,或使用 LINQPad,或调试 SQL 引擎。您的 SQL 是否有可能返回两行 NULL 电子邮件地址?

标签: c# sql linq


【解决方案1】:

这是一个已知问题,解决方法已经得到解答 -> herehere

您必须明确告诉它忽略它们。

【讨论】:

  • 由于他使用的是 LINQ to SQL,并且 SQL 返回了预期的结果,因此两者似乎都不相关。
【解决方案2】:

这是来自@Bactos 提供的链接。

您只需要使用内置的 C# 规范化和 CharUnicodeInfo 去除所谓的变音符号。

您只需像这样调用每个电子邮件地址:

var listOfContacts = (from contacts in something
                where contacts.Team.Id.Equals(TeamGuid) && !contacts.Email.Equals(null)
                select new { contacts.Id, EmailAddress = CleanUpText(contacts.Email) }).ToList();

你需要的方法如下:

private static string CleanUpText(string text)
{
    var formD = text.Normalize(NormalizationForm.FormD);
    var sb = new StringBuilder();

    foreach (var ch in formD)
    {
        var uc = CharUnicodeInfo.GetUnicodeCategory(ch);

        if (uc != UnicodeCategory.NonSpacingMark)
        {
            sb.Append(ch);
        }
    }

    return sb.ToString().Normalize(NormalizationForm.FormC).ToLower();
}

希望有帮助!

【讨论】:

    【解决方案3】:

    由于您的第一个 LINQ 表达式中的 .ToList(),因此在 C# 中对 Email.ToLower() 的结果执行 GROUP BY

    这与您给出的 SQL 查询完全不同,其中 GROUP BY 是在原始 EMAIL 列上执行的,没有 ToLower()。查询返回不同的结果也就不足为奇了。

    【讨论】:

    • 没有 ToLower() 的结果差异更大。我相信它是 402 linq 到 419 SQL。 SQL不会自动忽略大小写吗?无论如何我测试并添加了 LOWER 并没有改变 SQL 中的结果集。
    【解决方案4】:

    我认为您可以尝试忽略 SELECT 子句中的 NULL 值。在您的 LINQ 查询中,您忽略了 NULL。

    【讨论】:

    • 结果集中没有 NULL。两个失踪者有口音。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多