2014-10-07 25 views
1

我想編寫一個Linq查詢(SQL後端),它通過來自多個列的值集合來限制行。爲了說明,一個天真的SQL查詢可能是這樣的,如果我知道了,前面的所有值:如何編寫一個Linq2Sql查詢,該查詢使用一組組合鍵或元組來限制行?

SELECT * 
FROM myTable 
WHERE (col1 = val1 AND col2 = val2 AND col2 = val3) 
OR (col1 = val4 AND col2 = val5 AND col2 = val5) 
OR (col1 = val6 AND col2 = val7 AND col2 = val8) 
-- etc... 

如果我在SQL在寫這一點,我會考慮使用一個加入反對臨時表,表值參數或類似構造。我將如何用Linq2Sql完成此任務?我的值不存儲在另一個表中,是從代碼和用戶輸入計算的,並且通常不會預先知道 - 我將它們作爲元組的集合接收。

我知道我無法加入內存集合而無需首先將整個表加載到內存中,並且在這些情況下僅限於使用Contains,導致產生WHERE ... IN子句。是否有可能使用這種技術的複合鍵和元組?

或者,我可以在上面的示例中手動構建WHERE子句的表達式樹,模擬WHERE ... OR子句。有沒有更好的辦法?我懷疑這個SQL語句在條款中有幾百個OR語句時效率不高。

回答

-1

如何:

var list = from mT in context.MyTables 
      where (mT.col1 == val1 && mT.col2 == val2 && mT.col3 == val3) 
      || (mT.col4 == val4 && mT.col5 == val5 && mT.col6 == val6) 
      // etc etc 
      select mT; 

...其中val1..val6等是局部變量。這是'naïve'SQL查詢的一個非常直接的副本。

+0

感謝您的反饋!對不起,我不清楚我的問題(我會編輯) - 我實際上並不知道所有的值,因爲它們作爲一個集合傳遞給一個函數。 – 2014-10-07 17:05:59

+0

你的意思是你在編譯時會得到一個類似未知大小的列表?你需要匹配列表的第x個colX? – 2014-10-07 17:26:28

+0

是的,想象這個集合的類型是List >'。現在我需要爲列表中的每個元素創建一個謂詞,如下所示:'where(mt.Col1 == list [0] .Item1 && mt.Col2 == list [0] .Item2 && mt.Col3 == list [ 0] .Item3)|| (/ *重複列表[i] */...) 我可以創建一個循環,並建立一個表達式樹來做到這一點,但我很好奇,如果有一個更簡單的方法。 – 2014-10-07 17:43:00