我正在尝试将两个列表/集合合并(联合或concat)。这两个列表有一个共同的基类。例如我试过这个:
IQueryable<ContractItem> contractItems = myRepository.RetrieveContractItems();
IQueryable<ChangeOrderItem> changeOrderItems = myRepository.RetrieveChangeOrderItems();
IQueryable<ItemBase> folderItems = contractItems.Concat<ItemBase>(changeOrderItems);
但是我收到了LINQ错误 DbUnionAllExpression需要具有兼容集合ResultTypes的参数。
有人知道如何正确地做到这一点吗?我唯一可以google的是另一个StackOverflow问题: LINQ Union objects with same Base Class
感谢。
答案 0 :(得分:14)
使用Cast
运算符:
IQueryable<ItemBase> folderItems = contractItems
.Cast<ItemBase>()
.Concat(changeOrderItems.Cast<ItemBase>());
另一个问题的答案适用于LINQ to Objects,但不一定适用于LINQ to Entities或LINQ to SQL。
或者,您可以通过调用AsEnumerable
:
IQueryable<ItemBase> folderItems = contractItems
.AsEnumerable()
.Concat<ItemBase>(changeOrderItems);
但是,请注意LINQ to Objects; Concat
可以在没有任何开销的情况下工作(遍历数据库中的两个集合),但是Union
将完全从数据库中提取其中一个集合,然后遍历另一个集合。