我有一个看起来应该是相当简单的linq问题。我正在使用行为区分大小写的Contains
进行字符串比较,我需要它不区分大小写。我知道这样做的正确方法是使用接受StringComparison.OrdinalIgnoreCase
参数的IndexOf
方法重载。
问题是,我挂在(emailAddresses)上的IndexOf
对象是字符串的枚举,因此没有可用的IndexOf
。我也尝试过emailAddresses.Contains(x.Email, StringComparer.InvariantCultureIgnoreCase
,但它抛出了这个错误:
LINQ to Entities无法识别方法"Boolean Contains[String](System.Collections.Generic.IEnumerable 1[System.String],System.String,System.Collections.Genric.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();
}
怎么样:
.Where(x => emailAddresses.Select(y => y.ToLower()).Contains(x.Email.ToLower())
它会将您的所有集合元素更改为小写版本,并尝试在该集合中查找用户电子邮件的小写版本。
你可以选择ToUpper
,它应该没有什么区别。
如果它是一个LINQ到对象查询,您可能应该使用ToLowerInvariant
,但由于LINQ到实体不支持它,您必须在此处使用ToLower
`
如果电子邮件地址是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())