我正在尝试将(联合或连接)两个列表/集合合二为一。这两个列表有一个共同的基类。例如我试过这个:
IQueryable<ContractItem> contractItems = myRepository.RetrieveContractItems();
IQueryable<ChangeOrderItem> changeOrderItems = myRepository.RetrieveChangeOrderItems();
IQueryable<ItemBase> folderItems = contractItems.Concat<ItemBase>(changeOrderItems);
但是我收到了 LINQ 错误
DbUnionAllExpression 需要具有兼容集合 ResultTypes 的参数。
有谁知道如何正确地做到这一点?我唯一可以谷歌的是另一个 StackOverflow 问题:
LINQ Union objects with same Base Class
谢谢。
最佳答案
使用 Cast
运营商:
IQueryable<ItemBase> folderItems = contractItems
.Cast<ItemBase>()
.Concat(changeOrderItems.Cast<ItemBase>());
另一个问题的答案适用于 LINQ to Objects,但不一定适用于 LINQ to Entities 或 LINQ to SQL。
或者,您可以通过调用
AsEnumerable
转换为 LINQ to Objects。 :IQueryable<ItemBase> folderItems = contractItems
.AsEnumerable()
.Concat<ItemBase>(changeOrderItems);
但是,请注意 LINQ to Objects;
Concat
可以在没有任何开销的情况下工作(遍历数据库中的两个集合),但是 Union
将完全从数据库中提取一个集合,然后遍历另一个集合。
关于linq - 如何将 2 个不同的 IQueryable/List/Collection 与相同的基类结合起来? LINQ 联合和协方差问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6614989/