我看起来应该是一个相当简单的linq问题。我正在使用Contains
进行字符串比较,其行为区分大小写,我需要它不区分大小写。我知道这样做的正确方法是使用带有IndexOf
参数的StringComparison.OrdinalIgnoreCase
方法重载。
问题是我挂起IndexOf
的对象(emailAddresses)是字符串的枚举,所以没有IndexOf
可用。我也尝试了emailAddresses.Contains(x.Email, StringComparer.InvariantCultureIgnoreCase
,但它抛出了这个错误:
LINQ to Entities无法识别方法'Boolean Contains [String](System.Collections.Generic.IEnumerable 1 [System.String],System.String,System.Collections.Generic.IEqualityComparer 1 [System.String]) '方法
如何重构这个以使.Where(x => emailAddresses.Contains(x.Email)
部分不区分大小写?
public IList<string> FindInvalidEmails(UserContext userContext, IEnumerable<string> emailAddresses)
{
var validEmails = new List<string>();
emailAddresses.ForEachChunk(100, emailAddressesChunk =>
validEmails.AddRange(_enterpriseRepositoryFactory.GetMemberRepository(userContext.EnterpriseId).FindAll()
.Where(x => emailAddresses.Contains(x.Email) && !x.IsDeleted)
.Select(x => x.Email)
.ToList())
);
return emailAddresses.Except(validEmails).ToList();
}
答案 0 :(得分:8)
怎么样:
.Where(x => emailAddresses.Select(y => y.ToLower()).Contains(x.Email.ToLower())
它会将您的所有收藏元素更改为小写版本,并尝试在该收藏集中找到小写版本的用户电子邮件。
您可以选择ToUpper
,但它应该没有区别。
如果它是LINQ to object查询,你可能应该使用ToLowerInvariant
,但因为LINQ to Entities不支持它,你必须在这里使用ToLower
答案 1 :(得分:1)
如果emailAddresses为IEnumerable
,您可以执行....
.Where(x => emailAddresses.Any(em => em.ToLower() == x.Email.ToLower())
或
//Build a list of lower emails in memory
var lowerEmails = emailAddress.Select(em => em.ToLower()).ToList();
...
.Where(x => lowerEmails.Contains(x.Email.ToLower())