簡體   English   中英

通過聯接在多個表中選擇多個項目

[英]Select multiple items across multiple tables with join

嘗試將SQL查詢轉換為LINQ(因為我添加了代碼來下載2個SQL表並將它們保存到內存中的DataSet中)。 因此,我需要LINQ選擇與SQL相同的內容。

SQL查詢

SELECT s.item1, s.item2, l.itemA, l.itemB
FROM table1 s, table2 l
WHERE l.itemA = name AND s.item1 = l.itemB

到目前為止,我還沒有編譯(DBConfig是具有多個表的DataSet)

var query = from l in DbConfig.Tables["table2"].AsEnumerable()
            join s in DbConfig.Tables["table1"].AsEnumerable() on l.Field<string>("itemB") equals s.Field<string>("item1")
            where l.Field<string>("itemA") == name
            select s.item, s.item2, l.itemA, l.itemB;

我對LINQ還是很陌生,所以任何幫助都會很大,謝謝!

首先,請注意,當您調用AsEnumerable ,查詢必須在客戶端而不是SQL服務器上執行。 強烈建議您將表保留為IQueryable ,以避免出現這種情況。

接下來,正如Tim S.解釋的那樣 ,由於您的表不是強類型的,因此請使用Field<T>方法檢索列值。

最后,如果要返回多列,則需要將結果分組為匿名類型:

var query = from l in DbConfig.Tables["table2"]
            join s in DbConfig.Tables["table1"]
            on l.Field<string>("itemB") equals s.Field<string>("item1")
            where l.Field<string>("itemA") == name
            select new { 
                item = s.Field<string>("item"), 
                item2 = s.Field<string>("item2"), 
                itemA = l.Field<string>("itemA"), 
                itemB = l.Field<string>("itemB") 
            };

或創建一個命名類型來表示結果:

public class MyResultType {
    public string item { get; set; }
    public string item2 { get; set; }
    public string itemA { get; set; }
    public string itemB { get; set; }
}

var query = from l in DbConfig.Tables["table2"]
            join s in DbConfig.Tables["table1"] 
            on l.Field<string>("itemB") equals s.Field<string>("item1")
            where l.Field<string>("itemA") == name
            select new MyResultType { 
                item = s.Field<string>("item"), 
                item2 = s.Field<string>("item2"), 
                itemA = l.Field<string>("itemA"), 
                itemB = l.Field<string>("itemB") 
            };

由於您不處理強類型結果,因此無法使用s.item1選擇結果; 您必須像其他查詢一樣使用Field<> (或類似方法)。 另外,由於您只能在LINQ查詢中選擇一個對象,並且需要四個值,因此您應該以新的匿名類型選擇它們,或者創建一個類型來存儲它們。

var query = from l in DbConfig.Tables["table2"].AsEnumerable()
            join s in DbConfig.Tables["table1"].AsEnumerable()
              on l.Field<string>("itemB") equals s.Field<string>("item1")
            where l.Field<string>("itemA") == name
            select
      new { Item1 = s.Field<string>("item1"), Item2 = s.Field<string>("item2"),
            ItemA = l.Field<string>("itemA"), ItemB = l.Field<string>("itemB") };

請嘗試這個

var data=from dr1 in DbConfig.Tables["table2"].AsEnumerable()
      join dr2 in DbConfig.Tables["table1"].AsEnumerable()
        on dr1.Field<string>("itemB") equals  dr2.Field<string>("item1")
      where dr1.Field<string>("itemA") == name
      select new {item = dr2.Field<string>("item"), 
                item2 = dr2.Field<string>("item2"), 
                itemA = dr1.Field<string>("itemA"), 
                itemB = dr1.Field<string>("itemB") }

為了可維護性和可擴展性,請始終使用命名類型(自定義類)而不是匿名類型。

如果您想查看lambda語法

var query = DbConfig.Tables["table1"].AsEnumerable()
            .Join
            (
                DbConfig.Tables["table2"].AsEnumerable(),
                x=>x.Field<string>("item1"),
                x=>x.Field<string>("itemB"),
                (t1,t2)=>new {t1,t2}
            )
            .Where
            (
                x=>x.t2.Field<string>("itemA") == name
            )
            .Select
            (
                x=>
                new
                {
                    x.t1.Field<string>("item"), 
                    x.t1.Field<string>("item2"), 
                    x.t2.Field<string>("itemA"), 
                    x.t2.Field<string>("itemB")
                }
            )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM