簡體   English   中英

Linq在DataSet中查詢多個DataTable

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

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