[英]LINQ can't use string.contains?
這是我的代碼:
string queryString = "Marco".ToLower();
utenti = db.User.Where(p =>
queryString.Contains(p.Nickname.ToLower()) ||
queryString.Contains(p.Nome.ToLower()) ||
queryString.Contains(p.Cognome.ToLower())).ToList();
但我得到:
String.Contains方法僅支持可在客戶端上計算的參數。
為什么? 我不能使用.Contains()
?
試試.IndexOf
。 它不是LINQ,不能做Contains
,它的LINQ to Entities和LINQ to SQL不能。
string queryString = "Marco";
utenti = db.User.Where(p =>
queryString.IndexOf(p.Nickname, StringComparison.OrdinalIgnoreCase) >= 0 ||
queryString.IndexOf(p.Nome, StringComparison.OrdinalIgnoreCase) >= 0 ||
queryString.IndexOf(p.Cognom, StringComparison.OrdinalIgnoreCasee) >= 0)
.ToList();
為什么?
LINQ使用延遲執行 。 這意味着它等待您想要在執行任何操作之前迭代查詢結果。 LINQ有3種主要類型:
IEnumerable
已經在堆上時。 在第二個2的上下文中延遲執行意味着您的查詢不會在數據庫中執行,直到您在foreach
塊中枚舉結果,或調用枚舉方法,如.ToList
, .ToArray
等。在此之前,您的查詢只是作為表達式樹存儲在內存中。
如果db.User
是內存中的集合,那么您的查詢將只是db.User
。 但是,當數據在數據庫中時,LINQ to Entities(或LINQ to SQL)必須將表達式樹轉換為它所謂的“存儲表達式” - 這對於“將我的LINQ表達式轉換為SQL”來說只是花哨的討論。
現在假設你有一個你想要用於查詢的自定義C#算法,你做了類似這樣的事情:
var result = db.User.Where(x => MyCustomMethod(x));
今天LINQ to Entities無法將您的C#代碼轉換為SQL查詢(存儲表達式)。 每天依賴的許多其他C#方法也是如此。 它也不支持.ToLower
, .ToUpper
, .StartsWith
, .EndsWith
等。可以轉換為存儲表達式的C#方法數量有限,而.IndexOf
恰好就是其中之一。
但是請記住,我們在這里討論的只是字符串對象的Contains
方法,這對於商店表達式是不支持的。 LINQ to Entities確實支持IEnumerable
的.Contains
。 以下是有效的,將與LINQ to Entities一起使用(不確定LINQ to SQL):
var idsIWantToFind = new[] { 1, 2, 3 };
var users = db.Where(x => idsIWantToFind.Contains(x.UserId));
以上相當於執行SQL WHERE UserId IN (1, 2, 3)
謂詞。
問題是投入的優先考慮。 例如:
a.Contains(b)中; 或b。包含(a);
你最好寫:
p.Nickname.Contains(queryString) ...
代替
queryString.Contains(p.Nickname) ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.