2010-07-28 153 views
0

我從來沒有找到一個優雅的方式來做到這一點,所以我想知道其他開發人員喜歡什麼方法(爲了性能,可讀性等)。DataTable.Select使用IN運算符

有沒有辦法在DataTable.Select()函數中使用LIKE運算符,基於對另一個DataTable的查詢結果。例如,在SQL Server中,語法爲:

Select SomeValue 
From Table1 
WHERE MyField IN 
    (Select SomeField From Table2 Where SomeColumn = SomeFilterVariable) 

我知道,從編碼的角度看,這是一個非常簡單的查詢做對DB,但這是一個應用程序正在做那裏做由於計算涉及的次數多,這種方式會導致成千上萬次對服務器的調用。我已經計算了它,並且一次獲取所有數據並使用DataTable.Select()或DataTable.Compute()來獲得我需要的結果會更好。

我對任何包括LINQ到數據集等都是開放的。我真正需要避免的是到服務器的很多次旅行。

回答

1
from t1 in db.Table1 
where (from t2 in db.Table2 where t2.SomeColumn = SomeFilterVariable select t2.SomeField).Contains(t1.MyField) 
select t1.SomeValue; 

如果這對你來說太亂:

var subQ = from t2 in db.Table2 
      where t2.SomeColumn = SomeFilterVariable 
      select t2.SomeField; 

var query = from t1 in db.Table1 
      where subQ.Contains(t1.MyField) 
      select t1.SomeValue; 

這裏的很酷的事情是這樣的LINQ工作,將建立&只執行一個SQL語句,基本持平你發佈的SQL。

+0

但是,這將轉到服務器來執行此操作,對嗎?我特別注意避免前往數據庫服務器,並首先獲取數據(整個表),然後針對內存中的DataTable(DataSet的一部分)執行類似的查詢。儘管我會爲此選擇一個好的Linq語法,我可以在另一個DB往返性能損失並不那麼可怕的情況下使用。 – David 2010-07-28 17:22:47

+0

如果集合(db.Table1&db.Table2)是Table實體,它將轉到數據庫。如果他們是regaulr收集,它會在記憶中工作。語法應該保持不變。 – 2010-07-28 18:00:34

+0

你是對的...謝謝。 – David 2010-07-29 15:27:50

0

上面的例子中,我想你可以使用RIGHT JOIN來獲得你想要的數據。在這裏:

SELECT A.SomeValue 
FROM Table1 A 
RIGHT JOIN Table2 B 
ON A.MyField = B.SomeField 
WHERE B.SomeColumn = SomeFilterVariable 
+0

再次,這是去DB。我想在已經從數據庫填充的內存數據集上執行此操作。 – David 2010-07-28 17:24:32

+0

我想,如果「原始數據」沒有改變,你可以使用一些臨時數據表和一對夫婦循環... – 2010-07-28 17:32:07

+0

它不。這是調查截止日期後的調查結果列表。這是我正在使用的方法。我正在尋找更乾淨的東西,但謝謝你花時間回覆。 – David 2010-07-28 18:22:27