Linq/SQL 返回不同的结果

3
我很好奇为什么我的linq按组查询返回了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

3
那个列的排序设置是什么? - stuartd
2
ID号码可能存在错误。您的Linq查询正在查看ID号码,而SQL查询正在查看“TeamGuid”名称。 - jdweng
@stuartd,Latin1_General_CI_AI - kpolewaczyk
LINQ使用SQL来处理查询 - 您可以删除ToList并执行ToString以查看SQL,或者使用LINQPad或调试SQL引擎。您的SQL是否可能返回两行具有NULL电子邮件地址? - NetMage
如果在Linq语句中删除ToLower()会发生什么? - sgmoore
显示剩余6条评论
4个回答

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

希望这有所帮助!

2

这是一个已知的问题,解决方法已经在这里和这里回答 -> 这里这里

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


由于他正在使用LINQ to SQL,并且SQL返回了预期的结果,因此两者似乎都不相关。 - NetMage

1
由于您第一个LINQ表达式中的.ToList(),GROUP BY是在C#中执行的,针对Email.ToLower()的结果进行操作。
这与您提供的SQL查询根本不同,其中GROUP BY针对原始EMAIL列执行,而不是ToLower()。这些查询返回不同的结果并不奇怪。

没有使用ToLower()方法时结果的差异更大。我认为是402个Linq到419个SQL。SQL不会自动忽略大小写吗?无论如何我都进行了测试并添加了LOWER,但在SQL中结果集并没有发生变化。 - kpolewaczyk

0

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


结果集中没有 NULL。两个缺失的带有重音符号。 - kpolewaczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接