LINQ - 重构 。包含对 IEnumerable 的比较<string>,区分大小写



我有一个看起来应该是相当简单的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()) 

相关内容

最新更新