LINQ - Refactor.包含IEnumerable <string>的比较,区分大小写

dau*_*ash 2 c# linq entity-framework contains

我觉得应该是一个相当简单的linq问题.我正在进行字符串比较,使用的Contains是区分大小写的行为,我需要它不区分大小写.我知道这样做的正确方法是使用IndexOfStringComparison.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();
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*zek 8

怎么样:

.Where(x => emailAddresses.Select(y => y.ToLower()).Contains(x.Email.ToLower()) 
Run Code Online (Sandbox Code Playgroud)

它会将您的所有集合元素更改为小写版本,并尝试在该集合中查找较低版本的用户电子邮件.

你可以选择ToUpper,它应该没有区别.

如果这是一个LINQ到对象查询,你可能应该使用ToLowerInvariant,但因为它不是由LINQ支持到实体,你必须使用ToLowerhere`