繁体   English   中英

Linq / SQL返回不同的结果

[英]Linq/SQL Returning Different Results

我很好奇为什么我的linq group by query返回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

这是一个已知问题,已解决了解决方法 - > 此处此处

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

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

你只需要使用内置的C#规范化和CharUnicodeInfo去掉所谓的Diacritics。

您只需要为每个电子邮件地址拨打电话,如下所示:

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

希望有所帮助!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM