[英]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.