Как объединить 2different IQueryable / List / Collection с одним базовым классом? LINQ Union и вопросы ковариации - PullRequest
12 голосов
/ 07 июля 2011

Я пытаюсь объединить (объединить или объединить) два списка / коллекции в один.Два списка имеют общий базовый класс.например, я пробовал это:

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

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

Но я получаю сообщение об ошибке LINQ DbUnionAllExpression требует аргументов с совместимой коллекцией ResultTypes.

Кто-нибудь знает, как это сделать правильно?Единственное, что я мог найти в Google, - это еще один вопрос StackOverflow: LINQ Union объекты с тем же базовым классом

Спасибо.

1 Ответ

15 голосов
/ 07 июля 2011

Используйте оператор Cast:

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

Ответ на другой вопрос работает для LINQ to Objects, но не обязательно для LINQ to Entities или LINQ to SQL.

Кроме того, вы можете преобразовать в LINQ to Objects, вызвав AsEnumerable:

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

Однако будьте осторожны в LINQ to Objects; Concat будет работать без каких-либо накладных расходов (итерируя по обеим коллекциям из базы данных), но Union будет полностью извлекать одну из коллекций из базы данных, а затем перебирать другую.

...