【问题标题】:Linq Query Multiple DataTables in DataSetLinq查询DataSet中的多个DataTable
【发布时间】:2014-07-24 03:10:11
【问题描述】:

基本上我有一个包含 2 个数据表的数据集。 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 => p).Distinct()?连接这些表的正确方法是什么,以便查询通过他们的人员键返回每个人?非常感谢:)

【问题讨论】:

    标签: c# linq datatable dataset


    【解决方案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();
    

    【讨论】:

    • 我从来不知道 Zip 功能。很酷...我找到了另一种实现此目的的方法,我将在此处发布以供参考,但我将您的方法标记为答案。我今天学到了一些东西。谢谢安德鲁!
    【解决方案2】:

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

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

    【讨论】:

    • 这行得通,尽管我怀疑 Zip 解决方案会更有效一些。 Zip 基本上只是使用提供的 lambda 同时迭代两个序列,以从每对行中产生所需的结果。无需担心连接逻辑。
    猜你喜欢
    • 2010-09-05
    • 2011-03-13
    • 2018-11-15
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    相关资源
    最近更新 更多