2012-07-30 65 views
3

我試圖創建一個搜索方法,我想檢查關鍵字是否包含在給定記錄的任意數量的不同列中。在LINQ中加入列並運行包含運算符

我的LINQ的聲明如下:

string[] searchFilter = {"john", "iceberg"}; 


var q = from qua in qual 
        join del in deliverables on qua.ID equals del.Q_ID 
        where searchFilter.All(s => (qua.Name + " " + qua.Project + " " + qua.Summary + " " + del.Name + " " + del.Summary).ToLower().Contains(s)) 
        select qua; 

我卻得到其中指出的錯誤信息:「本地序列不能在LINQ可以用於除載有()操作執行SQL查詢操作的。 「

+0

那麼,什麼是問題?這個例外很自我解釋 - 你有一個本地序列(閱讀:內存中),並且你不能在帶有L2S的linq查詢中使用它,除非你將它與Contains() - 運算符一起使用。您正在使用全運算符,因此您不能在查詢中使用本地序列。 – Maarten 2012-07-30 13:46:25

+0

你可能會提出一個解決上述問題的方法嗎?謝謝。 – stats101 2012-07-30 13:54:24

回答

0

的包含方法,無論出於何種原因,在第二次通過循環時都沒有使用過濾結果。最終奏效的方法是:

var SearchColumn = from qua in Qual 
       join del in deliverables on qua.Q_ID equals del.Q_ID into left_j 
          from del in left_j.DefaultIfEmpty() 
          select new { qua.Name + " " + qua.Project + " " + qua.Summary + " " + del.Name + " " + del.Summary).ToLower() }; 

foreach (var f in searchFilter) 
{ 
    var likestr = string.Format("%{0}%", f); 
    SearchColumn = SearchColumn.Where(x => SqlMethods.Like(x.Search_Col, likestr)); 
} 
1

你的確不能使用所有的方法,但只包含方法:

var q = from qua in qual 
     join del in deliverables on qua.ID equals del.Q_ID 
     where searchFilter.Contains(qua.Name) || searchFilter.Contains(qua.Project)... 
     select qua; 

當然你也可以用表達式動態結合您的LINQ查詢(但它可能是更多的工作),或使用動態LINQ。

+0

這不會產生相同的結果。對於Name ='johnx'的記錄,您的查詢不會返回結果,但是來自OP的查詢將會(或者那是意圖)。如果序列中的所有項目都適用,那麼.All運算符將僅返回,這是Contains不能執行的操作。 – Maarten 2012-07-30 13:51:18

1

不要以爲你有選擇:

但是當你在一個「可查詢」世界留下來,這會產生只有一個SQL請求(醜陋的,但是......)

var q = from qua in qual 
     join del in deliverables on qua.ID equals del.Q_ID 
     select new{ qua, del}; 

foreach (var filter in searchFilter) 
    q = q.Where(v => (v.qua.Name + " " + v.qua.Project + " " + v.qua.Summary + " " + v.del.Name + " " + v.del.Summary).ToLower().Contains(filter)); 

var result = q.Select(p => p.qua); 
+0

與Amiram答案類似,這不會返回匹配數組內所有項目的結果。 – stats101 2012-07-30 15:50:56

+0

@ stats101哦,是的,它會。 – 2012-07-30 15:55:32

+0

只是試了一下。奇怪的是,當它第二次出現在循環中時,它不會使用第一次傳遞的過濾結果,而是使用原始結果。 :S – stats101 2012-07-30 17:02:01