ado.net将两行合并为1

时间:2010-09-21 19:15:05

标签: c# linq ado.net

我正在开发一个项目,它将结合几个sharepoint listitemcollections。它基本上是将三个共享点列表汇集在一起​​。

我已经获得了三个sharepoint查询以返回正确的结果,我使用.GetDataTable()方法为LINQ连接生成我的对象。

以下是我的代码。我可能正在接近这个错误,但如果有办法,我可以返回一个数据行,其中包含所有三个对象,这就是我所需要的。

DataTable dtContracts = _contractList.GetDataTable();
        DataTable dtCustomer = _customerList.GetDataTable();

        var joined = from contracts in dtContracts.AsEnumerable()
                           join customers in dtCustomer.AsEnumerable()
                           on contracts.Field<String>("ContractNumber")
                           equals customers.Field<String>("ContractNumber")
                           join SPListItem loans in _loanList
                           on contracts["ContractNumber"] equals loans["Contract_x0020_Number"] 
                           into JoinedContractLoans
                           from loans in JoinedContractLoans.DefaultIfEmpty()
                           select new { contracts, customers,loans };

1 个答案:

答案 0 :(得分:0)

创建新的DataRow实例并不可行,因为您无法直接访问the constructor来创建实例;您必须创建一个DataTable,其中包含您拥有的三个不同DataTable个实例中的所有列,然后通过DataTable添加行。

虽然这肯定是可行的,但还有很多额外的工作。

您还可以创建一个匿名/具体类型,其中 all 来自单独的DataTable个实例的字段并填充其实例,如下所示:

// Rest of query the same.
select new { 
    ContractNumber = contracts.Field<string>("ContractNumber")
    // All other contract fields.

    // All customer fields.

    // All loan fields.
};

如果您正在使用匿名类型,那么这将很容易维护。但是,对于一个具体的课程,它可能有点笨拙。

也就是说,你现在剩下你所拥有的东西,创建一个匿名类型,它引用了三个数据行。它可能是最容易维护的,假设使用它的代码采用相同的方法。

那就是说,如果你必须在方法之外传递这个,我建议你使用一个强类型的data transfer object来映射DataRow,然后传回三个数据的集合转移对象。

当然,如果你要走那条路,那么你应该看一下LINQ-to-Entities,因为这基本上是为了这个目的而做的(它可能会简化很多代码)。