2011-07-07 10 views
9

İki listeyi/koleksiyonu bir araya getirmeye çalışıyorum (birlik veya concat). İki listelerin ortak bir temel sınıfı var. Örneğin. Bu denedim:2different IQueryable/List/Collection aynı temel sınıfla nasıl birleştirilir? LINQ Birliği ve Kovaryans sorunları

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

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

Ama LINQ hatası DbUnionAllExpression uyumlu toplama ResultTypes ile argüman gerektirir alıyorum.

Bunu nasıl düzgün yapılacağını bilen var mı? LINQ Union objects with same Base Class

Teşekkür: Ben google tek şey başka bir StackOverflow soru oldu.

cevap

13

Kullanım Cast operatörü:

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

diğer sorunun cevabı LINQ nesnelere uyar ama mutlaka LINQ için SQL Objeler'de veya LINQ to.

Alternatif olarak, AsEnumerable arayarak LINQ nesnelere dönüştürebilirsiniz:

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

Ancak LINQ Nesneler özen; Concat, herhangi bir ek yük olmadan çalışacaktır (her iki koleksiyonda da veritabanından yinelenen), ancak Union koleksiyonlardan birini veritabanından tamamen çeker ve ardından diğerinden yineler.

+0

Çok hızlı yanıt için teşekkür ederiz. Cast operatörünü denedim, ancak şu hatayı aldım: Alınılamıyor ... LINQ to Tüzel Kişiler, yalnızca Varlık Veri Modeli ilkel türlerini dökümlemeyi destekliyor. "Bu konuda herhangi bir düşünce var mı? Teşekkür ederiz. – Raymond

+0

" Yayınla "yı," Tür "ile değiştirmeyi deneyebilirsiniz 'ItemBase' fiili bir varlık taban türü midir? –

+0

Yanıtı, LINQ-to-Entities aracılığıyla çalışamazsak, kesinlikle çalışacak olan bir LINQ-to-Objects yaklaşımıyla güncelleştirdim. –

İlgili konular