2013-11-20 39 views
2

我有什麼似乎應該是一個相當簡單的LINQ問題。我正在做一個字符串比較使用Contains行爲敏感,我需要它是不區分大小寫的。我知道正確的方法是使用IndexOf方法重載,該參數取值爲StringComparison.OrdinalIgnoreCaseLINQ - 重構。含IEnumerable <string>的比較區分大小寫

問題是,我掛在(emailAddresses)IndexOf對象是一個字符串的枚舉,因此沒有IndexOf可用。我也試過emailAddresses.Contains(x.Email, StringComparer.InvariantCultureIgnoreCase但它拋出這個錯誤:

LINQ to Entities does not recognize the method 'Boolean Contains[String](System.Collections.Generic.IEnumerable 1[System.String], System.String, System.Collections.Generic.IEqualityComparer 1[System.String])' method

如何重構這使得.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

你應該更清楚你的IEnumerable''來自實體弗拉我的工作,否則你會得到很多答案,實際上不工作。 –

回答

8

如何:

.Where(x => emailAddresses.Select(y => y.ToLower()).Contains(x.Email.ToLower()) 

它會改變你的所有集合元素融入小寫版本,並嘗試在集合中找到用戶的電子郵件的小寫版本。

你可以選擇ToUpper代替,它應該沒有區別。

如果這是一個LINQ到對象查詢,你可能應該使用ToLowerInvariant,但因爲它不是由LINQ支持到實體,你必須使用ToLower here`

+0

或ToUpper。 –

+1

我不知道爲什麼評論被刪除,但你是正確的:'emailAddresses'本身是一個列表,所以它必須迭代,而不是調用'ToLower()'。 –

+1

@JeroenVannevel你是對的!我錯過了。更新了我的答案。 – MarcinJuraszek

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()) 
+1

我想過,但如果在某些語言中不會失敗?我必須支持中文,俄文,荷蘭文等... – daustinash

+0

我不確定任何版本都可以工作。將其轉換爲SQL查詢可能存在問題。 – MarcinJuraszek