2010-08-17 5 views
6

Temel olarak iki Itobil'i bir IeVable ile birleştirmek ve döngümüm bittikten sonra tüm kayıt kümesini döndürmek istiyorum. Mükemmel bir şekilde çalışıyor ama sonunda benim objemde bir şey yok ama ne zaman hata ayıkladığımda bazı kayıtları var. Yanlış Tıpkı diğer sorgu operatörleri gibiSorun yaratma boş IQueryable <T> object

IQueryable<MediaType> objret = Enumerable.Empty<MediaType>().AsQueryable(); 
var typ = _db.MediaTypes.Where(e => e.int_MediaTypeId != 1 && e.int_MediaTypeId_FK == null).ToList(); 
for (int i = 0; i < typ.Count; i++) 
{ 
    IQueryable<MediaType> obj = _db.MediaTypes.Where(e => e.bit_IsActive == true && e.int_MediaTypeId_FK == typ[i].int_MediaTypeId); 
    IQueryable<MediaType> obj1 = _db.MediaTypes.Where(e => e.int_OrganizationId == Authorization.OrganizationID && e.bit_IsActive == true && e.int_MediaTypeId_FK == typ[i].int_MediaTypeId); 

    if (obj1.Count() > 0) 
     obj.Concat(obj1); 
    if(obj.Count() > 0) 
     objret.Concat(obj); 
} 
return objret; 

cevap

4

yapıyor wht im, Concat varolan diziyi değiştirmez - bir yeni dizisini döndürür. Yani

bu satırlar:?

if (obj1.Count() > 0) 
    obj.Concat(obj1); 
if(obj.Count() > 0) 
    objret.Concat(obj); 

Ben IQueryable Eğer LINQ to SQL (karıştırma olduğunuzu göz önüne alındığında, bu idare edecek kadar iyi emin değilim

if (obj1.Count() > 0) 
    objret = objret.Concat(obj1); 
if(obj.Count() > 0) 
    objret = objret.Concat(obj); 

olmalıdır belki Varlıklar) Enumerable.AsQueryable ile, dikkat edin. Count() çağrıları nedeniyle sorguları bir dereceye kadar yürütüyorsanız, bunun yerine bir List<T> oluşturmayı düşündünüz mü?

(Sen hiç Count() yürütmek gerekmez - sadece obj için List<T>.AddRange(obj1) ve ditto diyoruz.) Tüm bu yapabilirdi bir çözüm kullanmak

jeroenh belirtildiği gibi, ideal olarak iyi olurdu C# kodunuzda hiç döngü olmadan veritabanı.

+0

Bir Listesini oluşturmak için değiştirmek ve çalışır:

Dahası, sana tek bir sorgu ile yapılabilir (test) çizgisinde bir şeyler başarmak için çalışıyoruz ne düşünüyorsunuz Teşekkürler. –

+0

Bu yaklaşım, döngü için her yineleme için veritabanına 4 gidiş gelişi oluşturur ... Bu bana sorarsanız olası bir performans sorunudur (tabii ki tablonun gerçek boyutuna bağlı olsa da). – jeroenh

+0

@jeroenh: Evet, 'Count()' ı kullanmanız gerekmediğini ima ediyordum. Bunu daha net yapacağım. –

0

Bunu bir döngü ile yapmamalısınız. Gönderdiğiniz kod, Count() ve iki kez de gerçek sonuçları almak için iki kez olmak üzere, her bir aktif mediatip için iki kez db'ye gidecektir.

Count() özelliğinin kontrol edilmesi gerekli değildir: boş sonuç kümelerinin birleştirilmesinin ek bir etkisi yoktur.

 // build up the query 

     var rootTypes = _db.MediaTypes.Where(e => e.int_MediaTypeId != 1 && e.int_MediaTypeId_FK == null); 
     var activeChildren = _db.MediaTypes 
           .Where(e => e.bit_IsActive); 
     var activeChildrenForOrganization = _db.MediaTypes 
           .Where(e => e.int_OrganizationId == Authorization.OrganizationID && e.bit_IsActive); 

     var q = from types in rootTypes 
       join e in activeChildren 
       on types.int_MediaTypeId equals e.int_MediaTypeId_FK into joined1 
       join e in activeChildrenForOrganization 
       on types.int_MediaTypeId equals e.int_MediaTypeId_FK into joined2 
       select new {types, joined1, joined2}; 


     // evaluate the query and concatenate the results. 
     // This will only go to the db once 
     return q.ToList().SelectMany(x => x.joined1.Concat(x.joined2));