我正在开发一个项目,它将结合几个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 };
答案 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,因为这基本上是为了这个目的而做的(它可能会简化很多代码)。