2011-08-22 34 views
1

我曾問如何使用 'IN' here.如何使用多個 'IN' 上一個DataTable

到目前爲止,SQL Server查詢:

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

可以翻譯爲:

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

我的問題是如何將這種SQL查詢翻譯:

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

這樣我就可以在另一個'IN'的column3上使用裏面的內容。

(例如)

select columnA 
    from table2 
    where columnB in 
    (
     select column3 
     from table1 
     where column1 in 
      (
       select column2 
       from table1 
      ) 
    ) 
+0

你需要在sql或c#中的解決方案?? –

+0

我在這裏看到的大問題是性能,嵌套INs,對我來說,呼喊要被連接取代。雖然我不太瞭解LINQ。 –

+0

我需要在C#中轉換SQL命令,就像第一個SQL命令如何轉換一樣。 –

回答

0

LINQ的是一種工具。它有其優點和侷限性。

我會做的是使用自定義查詢來完成此操作。讓SQL Server在這裏首當其衝,而不是Linq。它也會顯着改善性能。

var sqlTxt = "select columnA " + 
    "from table2 " + 
    "where columnB in " + 
    "(select column3 " + 
    " from table1 " + 
    " where column1 in " + 
     "(select column2 " + 
      "from table1) " + 
    ")" 

results = ExecuteQuery(sqlTxt); 
+0

爲什麼可怕的字符串建設,而不是字符串文字? – Manatherin

+0

(1)編譯器[將此簡化爲字符串文字](http://www.yoda.arachsys.com/csharp/stringbuilder.html),直接應用於變量。 (2)這樣做可以讓你連接到它,格式化等。(3)這不意味着最佳的C#代碼。只是一個如何解決Linq的例子。 – Richard

+0

@Richard,換句話說,我應該直接在數據庫中做到這一點。因爲DataTable中的數據在數據庫中不是**,所以我不能這樣做。這是應該發生的事情:將數據庫表中的所有數據放到DataTable()中(用戶完成該操作),用戶更改DataTable中的項目,並將數據從DataTable保存到數據庫中的另一個表中時,DataTable必須在此之前先進行驗證。上面的SQL命令只是我需要用DataTable做的一個例子。 –

相關問題