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

时间:2013-11-20 18:08:37

标签: c# linq entity-framework contains

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

2 个答案:

答案 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()) 
相关问题