簡體   English   中英

LINQ不能使用string.contains?

[英]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種主要類型:

  1. LINQ to Objects - 當你的IEnumerable已經在堆上時。
  2. LINQ to Entities - 當您想使用Entity Framework查詢數據庫時。
  3. LINQ to SQL - 當您想使用LINQ to SQL查詢數據庫時。

在第二個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM