如何将2个不同的IQueryable / List / Collection与相同的基类组合? LINQ联盟和协方差问题

时间:2011-07-07 17:56:27

标签: linq union covariance

我正在尝试将两个列表/集合合并(联合或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

感谢。

1 个答案:

答案 0 :(得分:14)

使用Cast运算符:

IQueryable<ItemBase> folderItems = contractItems
        .Cast<ItemBase>()
        .Concat(changeOrderItems.Cast<ItemBase>());

另一个问题的答案适用于LINQ to Objects,但不一定适用于LINQ to Entities或LINQ to SQL。

或者,您可以通过调用AsEnumerable

将LINQ转换为对象
IQueryable<ItemBase> folderItems = contractItems
        .AsEnumerable()
        .Concat<ItemBase>(changeOrderItems);

但是,请注意LINQ to Objects; Concat可以在没有任何开销的情况下工作(遍历数据库中的两个集合),但是Union将完全从数据库中提取其中一个集合,然后遍历另一个集合。