linq - 如何将 2 个不同的 IQueryable/List/Collection 与相同的基类结合起来? LINQ 联合和协方差问题

标签 linq union covariance

我正在尝试将(联合或连接)两个列表/集合合二为一。这两个列表有一个共同的基类。例如我试过这个:

        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/

相关文章:

scala - "return this"在返回实际类型的协变特征中

c# - 使用 Nest 字段提升的查询不会从 Elasticsearch 返回任何结果

c# - LINQ to SQL列有关键字作为列名,如何引用/转义

c# - linq to sql 查询帮助

c# - 如何使 select 语句动态化?林克

c# - WPF 如何将 ListBox.ItemsSource 转换为 ObservableCollection<some dynamic type>

mysql 选择计数联合

rust - 在 Rust 中对联合进行零初始化

flutter - 用于由 dart 中的卡住包生成的联合的 JsonConverter

c# - 将 IEnumerable 隐式转换为泛型类型