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

Ray*_*ond 12 linq union covariance

我试图将两个列表/集合合并(联合或concat).这两个列表有一个共同的基类.我试过这个:

        IQueryable<ContractItem> contractItems = myRepository.RetrieveContractItems();
        IQueryable<ChangeOrderItem> changeOrderItems = myRepository.RetrieveChangeOrderItems();

        IQueryable<ItemBase> folderItems = contractItems.Concat<ItemBase>(changeOrderItems);
Run Code Online (Sandbox Code Playgroud)

但是我得到LINQ错误DbUnionAllExpression需要带有兼容集合ResultTypes的参数.

有谁知道如何正确地做到这一点?我唯一可以google的是另一个StackOverflow问题: 具有相同基类的LINQ Union对象

谢谢.

Ste*_*ary 15

使用Cast运营商:

IQueryable<ItemBase> folderItems = contractItems
        .Cast<ItemBase>()
        .Concat(changeOrderItems.Cast<ItemBase>());
Run Code Online (Sandbox Code Playgroud)

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

或者,您可以通过调用AsEnumerable以下命令将LINQ转换为对象:

IQueryable<ItemBase> folderItems = contractItems
        .AsEnumerable()
        .Concat<ItemBase>(changeOrderItems);
Run Code Online (Sandbox Code Playgroud)

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