C# Linq/SQL返回不同的结果

C# Linq/SQL返回不同的结果,c#,sql,linq,C#,Sql,Linq,我很好奇为什么我的linq group by查询返回417个结果,而我的SQL解释返回419个结果?我正在从我的列表中寻找重复的电子邮件。我已经检查了结果集,linq集中缺少的两个电子邮件地址都有口音。林克不认识口音吗?有解决办法吗?电子邮件字段类型为nvarchar100 如果你有任何问题,请告诉我, 提前谢谢 var listOfContacts = (from contacts in something where contacts.Team.I

我很好奇为什么我的linq group by查询返回417个结果,而我的SQL解释返回419个结果?我正在从我的列表中寻找重复的电子邮件。我已经检查了结果集,linq集中缺少的两个电子邮件地址都有口音。林克不认识口音吗?有解决办法吗?电子邮件字段类型为nvarchar100

如果你有任何问题,请告诉我, 提前谢谢

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
选择电子邮件,然后计数* 来自某物 其中团队='此处插入的实际团队Guid' 通过电子邮件分组 COUNTLOWEREmail>1且电子邮件不为空 通过电子邮件订购 //返回419
这是一个已知问题,解决方法已得到解答->和


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

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

由于第一个LINQ表达式中的.ToList,GROUP BY是在C中对Email.ToLower的结果执行的


这与您给出的SQL查询完全不同,其中GROUPBY是在原始电子邮件列上执行的,没有ToLower。查询返回不同的结果并不奇怪。

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

希望有帮助

问题是什么?身份证号码可能有错误。您linq正在查看ID号,而SQL正在查看TeamGuid名称。@stuartd,Latin1\u General\u CI_AI@jdweng,我添加了团队Guid作为占位符,让我编辑以显示假guidLINQ使用SQL处理查询-您可以删除ToList并执行ToString以查看SQL,或使用LINQPad,或调试SQL引擎。您的SQL是否可能返回两行空电子邮件地址?因为他正在使用LINQ to SQL,SQL返回预期结果,两者似乎都不相关。如果没有ToLower,结果差异会更大。我相信是402 linq到419SQL。SQL不会自动忽略大小写吗?不管怎样,我测试并添加了LOWER,它没有改变SQL中的结果集。结果集中没有空值。这两个失踪者都有口音。