Linq在DataSet中查询多个DataTable

时间:2014-06-03 17:05:45

标签: c# linq datatable dataset

基本上我有一个DataSet,其中包含2个DataTables。 DataTables不共享公共密钥或字段,但它们的行索引相关。我已经尝试了MSDN示例http://msdn.microsoft.com/en-us/library/bb386921(v=vs.110).aspx中的以下代码,但因为它们没有共享一个公共字段,所以我无法正确加入它们,所以我尝试使用两个FROM连接来加入表格知道错了。这就是我所拥有的:

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 =&gt; p).Distinct()?连接这些表的正确方法是什么,以便查询通过其人员密钥返回每个人?非常感谢:)

2 个答案:

答案 0 :(得分:1)

如果您知道这两个表格的排序正确,并且所有记录都正确匹配,那么您可以将它们拼接在一起:

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();

答案 1 :(得分:0)

我发现这是解决我遇到的问题的另一种方式:

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之间有什么区别吗?感谢您的帮助!