[英]Linq Query Multiple DataTables in DataSet
基本上我有一個DataSet包含讓我們說2個DataTables。 DataTables不共享公共密鑰或字段,但它們的行索引相關。 我嘗試了以下代碼來自MSDN示例http://msdn.microsoft.com/en-us/library/bb386921(v=vs.110).aspx,但因為他們沒有共享一個共同的字段我無法加入他們正確,所以我試圖加入使用兩個FROM(s)加入我知道錯誤的表。 這是我有的:
public DataTable buildEmployeeDataTable(DataSet ds)
{
DataTable personIdentity = ds.Tables["PersonIdentity"];
DataTable person = ds.Tables["Person"]; ;
var query = (
from pi in personIdentity.AsEnumerable()
from p in person.AsEnumerable()
select new
{
PersonKey = pi.Field<string>("PersonKey"),
PersonNumber = p.Field<string>("PersonNumber"),
FullName = p.Field<string>("FullName")
}).ToList();
DataTable dataTable = ConvertToDataTable(query);
return dataTable;
}
它有點工作,但這樣做:
PersonKey PersonNumber FullName
1 42 Bob
1 62 Jon
1 57 Tom
2 42 Bob
2 62 Jon
2 57 Tom
3 42 Bob
3 62 Jon
3 57 Tom
我是否需要將結果存儲在另一個DataTable中並運行SelectMany(p => p).Distinct()? 連接這些表的正確方法是什么,以便查詢通過其人員密鑰返回每個人? 非常感謝 :)
如果你知道這兩個表是正確排序的,並且所有記錄都正確匹配,那么你可以將它們拼接在一起:
var identities = personIdentity.AsEnumerable();
var persons = person.AsEnumerable();
var query = identities.Zip(persons, (pi, p) => new
{
PersonKey = pi.Field<string>("PersonKey"),
PersonNumber = p.Field<string>("PersonNumber"),
FullName = p.Field<string>("FullName")
})
.ToList();
這是我發現的另一種解決了我遇到的問題的方法:
public DataTable buildEmployeeDataTable(DataSet ds)
{
DataTable personIdentity = ds.Tables["PersonIdentity"];
DataTable person = ds.Tables["Person"]; ;
var query = (
from pi in personIdentity.AsEnumerable()
join p in person.AsEnumerable()
on personIdentity.Rows.IndexOf(pi) equals
person.Rows.IndexOf(p)
select new
{
PersonKey = pi.Field<string>("PersonKey"),
PersonNumber = p.Field<string>("PersonNumber"),
FullName = p.Field<string>("FullName")
}).ToList();
DataTable dataTable = ConvertToDataTable(query);
return dataTable;
}
我想知道這和Zip之間有什么區別嗎? 感謝您的幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.