2011-08-20 16 views
2

我有這樣的代碼在MS SQL:如何使用 'IN' 上一個DataTable

select * from table where column1 in (select column2 from table) 

怎麼可以這樣使用一個DataTable我翻譯?

線沿線的東西:table.select("column1 in column2")

回答

2

你不能。 但你可以通過LINQ + table.select做到這一點:

table.Select(string.Format("CITY in '{0}'",string.Join("','",table.Rows.OfType<DataRow>().Select(r=>r["COUNTRY"].ToString()).Distinct()))) 

解釋: 假設你有一個非常簡單的表格

ID城市國家
1美國紐約
2莫斯科俄羅斯
3 LA USA
4 St Peterburg俄羅斯

  1. 使用LINQ到對象我們從國家列中選擇所有唯一值並將值(通過string.Join)連接到IN過濾器語句字符串。對於我們的示例,它將成爲美國','俄羅斯
  2. 環繞聲IN過濾器語句用引號通過string.Format:'USA','Russia'
  3. 傳入IN filter in dataTable.Select(「CITY IN('USA' ,「俄羅斯」)「)

FYI:

如果需要對數據表\數據集執行很酷的SQL查詢,你可以用它NQuery是非常快速和符合標準。

+0

能否請您解釋一下這是如何工作? –

+0

所以這就是......簡單地說,這將不同的值連接在「國家」列中,並且由此生成的字符串將由Select()使用,對吧?但如果桌子有大約100行,這不會浪費時間嗎? –

+0

在我的例子中只有一個循環(Rows.Select),其他的例子使用多個循環。對於100行,它會很快。對於非常大的表格,我會推薦你​​使用NQuery。 –

1

假設表是在相同的數據集,可以將DataRelation添加到DataSet,然後訪問使用GetChildRows()

var relation = new DataRelation("RelationName", 
    dataSet.Tables["Parent"].Columns["Column2"], 
    dataSet.Tables["Child"].Columns["Column1"]); 

dataSet.Relations.Add(relation); 

var childRows = from row in dataSet.Tables["Child"].Rows 
       where row.GetParentRows("RelationName").Length > 0; 
+0

你用過兩張桌子嗎?我正在處理的表同時具有column1和column2。另外,我只使用了一個DataTable。從未使用數據集。 –

+0

現在的問題是:如何使用同一張表 –

1

您可以使用下面的LINQ到數據集查詢來獲取子行與您在SQL中查詢的結果相同。

var rows = from r1 in table.AsEnumerable() 
      from r2 in table.AsEnumerable() 
      where r1.Field<string>("Column1") == r2.Field<string>("Column2") 
      select r1; 

我從你的例子中假設列是來自同一張表。如果沒有,那麼你只需要改變上面的表格,如下所示。

var rows = from r1 in table1.AsEnumerable() 
      from r2 in table2.AsEnumerable() 
      where r1.Field<string>("Column1") == r2.Field<string>("Column2") 
      select r1; 

這類似於

select * from table1 where column1 in (select column2 from table2) 
+0

我使用了同一張表:)我不知道這是如何工作的......你能解釋更多你的第一個代碼嗎? –

+0

@傑拉德,那麼第一個例子應該爲你做的伎倆。我只是認爲安全地顯示兩個選項。 –

+0

@Chris我認爲你應該使用連接而不是IN。 –