我很好奇我的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
答案 0 :(得分:2)
答案 1 :(得分:2)
这是@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();
}
希望有帮助!
答案 2 :(得分:1)
由于您的第一个LINQ表达式中有.ToList(),因此正在C#中对Email.ToLower()的结果执行GROUP BY。
这与您给出的SQL查询完全不同,在SQL查询中,在原始的EMAIL列上执行GROUP BY,而没有ToLower()。查询返回不同的结果也就不足为奇了。
答案 3 :(得分:0)
我认为您可以尝试忽略SELECT子句中的NULL值。在LINQ查询中,您正在忽略NULL。