2012-08-17 53 views
3

我想用LINQ查詢數據庫。我將TableA與TableC一起加入TableA。構建Where子句(不確定PredicateBuilder將爲我工作)

我有很多'關鍵字'(不知道有多少在設計時間),我希望在(LIKE'%%')內查找遍佈三個表的幾個字段。

假設三(3)關鍵字輸入到我的搜索框:

在T-SQL我想有這樣的 -

SELECT tbl0.FieldA, tbl0.FieldB, tbl1.FieldC, tbl1.FieldD, tbl2.FieldE, tbl2.FieldF 

FROM tbl0 

JOIN tbl1 ON tbl0.KeyField = tbl1.KeyField 

JOIN tbl2 ON tbl1.KeyField = tbl2.KeyField 

WHERE (tbl0.FieldA LIKE '%{keyword1}%' OR tbl1.FieldC LIKE '%{keyword1}%' OR tbl2.FieldE LIKE '%{keyword1}%' OR tbl0.FieldA LIKE '%{keyword2}%' OR tbl1.FieldC LIKE '%{keyword2}%' OR tbl2.FieldE LIKE '%{keyword2}%' OR tbl0.FieldA LIKE '%{keyword3}%' OR tbl1.FieldC LIKE '%{keyword3}%' OR tbl2.FieldE LIKE '%{keyword3}%') 

的問題是 - 如何 '動態' 建立這個WHERE LINQ中的子句?

注#1 - 我不(對這個問題的範圍之外的原因)要創建跨越三個表的視圖

注2 - 因爲我以這種方式加入(和我我仍然對LINQ不熟悉)我不明白我如何使用PredicateBuilder,因爲我不確定TYPE(T)傳遞給它。

注意#3 - 如果它很重要......我最終計劃返回一個強類型的(自定義)對象列表以顯示在GridView中。

編輯 - 2012年8月17日 - 低於5:15 PM EDT

的意見是正確的。

「OP正在查找的代碼是,其中任何一個字段都包含關鍵字中的任何一個。」

謝謝大家!

+0

david.s - 我不認爲有人真的回答過這個問題。我只是刷新了頁面。我錯過了什麼?下面的'答案'不起作用。 Servy的評論是正確的......生成的SQL將包含「AND」而不是「OR」。 :-( – 2012-08-17 21:09:17

+0

david.s - 要點! – 2012-08-18 01:32:59

回答

3

這是一個不使用PredicateBuilder的解決方案。只需獲取包含第一個關鍵字的所有項目,並將其與包含第二個關鍵字的所有項目合併即可。不知道問題的背景我不知道這是否有效。

var query = from t0 in db.Table0 
      join t1 in db.Table1 on t0.KeyField equals t1.KeyField 
      join t2 in db.Table2 on t1.KeyField equals t2.KeyField 
      select new 
      { 
       t0.FieldA, t0.FieldB, 
       t1.FieldC, t1.FieldD, 
       t2.FieldE, t2.FieldF 
      }; 

string keyword = keywordsList[0]; 
var result = query.Where(x => x.FieldA.Contains(keyword) || 
           x.FieldC.Contains(keyword) || 
           x.FieldE.Contains(keyword)); 

for (int i = 1; i < keywordsList.Length; i++) 
{ 
    string tempkey = keywordsList[i]; 
    result = result.Union(query.Where(x => x.FieldA.Contains(tempkey) || 
              x.FieldC.Contains(tempkey) || 
              x.FieldE.Contains(tempkey))); 
} 

result = result.Distinct(); 
+0

這將導致獲取每個字段中存在每個關鍵字的所有行.OP正在查找的代碼是其中任何一個字段包含任何一個關鍵字換句話說,你需要對每個子表達式進行求和,但是目前你正在對它們進行求和。 – Servy 2012-08-17 16:13:47

+0

Servy - 我相當確定你是完全正確的,因爲我昨晚試了這個,當我設置一個斷點並看着生成的SQL使用每個關鍵字之間的AND(在foreach循環中) – 2012-08-17 21:06:42

+0

這是正確的=>「OP所要查找的代碼是**,其中任何一個字段包含任何一個關鍵字** 「 – 2012-08-17 21:10:36