2011-07-07 8 views
9

Próbuję połączyć (zjednoczenie lub concat) dwie listy/kolekcje w jedną. Te dwie listy mają wspólną klasę podstawową. na przykład Próbowałem to:Jak połączyć 2different IQueryable/List/Collection z tą samą klasą bazową? Problemy z Union i Covariance LINQ

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

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

Ale otrzymuję LINQ błąd DbUnionAllExpression wymaga argumentów z kompatybilnymi ResultTypes zbiórki.

Ktoś wie, jak to zrobić właściwie? Jedyne, co mogłem znaleźć w Google to kolejne pytanie związane z StackOverflow: LINQ Union objects with same Base Class

Dzięki.

Odpowiedz

13

użyć operatora Cast:

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

Odpowiedź na drugie pytanie pracuje dla LINQ to Objects, ale niekoniecznie dla LINQ do podmiotów lub LINQ to SQL.

Alternatywnie, można konwertować do LINQ to Objects wywołując AsEnumerable:

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

jednak zadbać w LINQ to Objects; Concat działałby bez jakiegokolwiek obciążenia (iteracja przez obie kolekcje z bazy danych), ale Union pobierałaby jedną z kolekcji w całości z bazy danych, a następnie iterowała przez drugą.

+0

Dziękuję za bardzo szybką odpowiedź. Próbowałem operatora obsady, ale otrzymuję ten błąd: Nie można rzutować ... LINQ do Entities obsługuje tylko podstawowe typy rzutowania Entity Data Model. "Wszelkie przemyślenia na ten temat? Dziękuję – Raymond

+0

Możesz spróbować zastąpić' Cast' z 'OfType' Czy "ItemBase" jest prawdziwym typem jednostki Entity? –

+0

Zaktualizowałem odpowiedź za pomocą podejścia LINQ-to-Objects, które z pewnością zadziała, jeśli nie będziemy w stanie uruchomić go za pośrednictwem LINQ-to-Entity –

Powiązane problemy