2015-08-19 22 views
5

Bazı kodları optimize etmeye çalışıyorum ama bununla ilgili biraz sorun yaşıyorum. Ben bir veritabanı var ve söz konusu tablolar enter image description hereVarlık çerçevesi - alt öğelerin doldurulması, çocuğun alt öğelerine filtreleme

Her EmailQueue öğesi birden EmailContact ve EmailEntity kayıtları olabilir ... EDMX böyle bakmak ve en hiçbiri olacak gerçi her EmailContact, birden EmailSendFailures olabilir.

En az bir EmailEntity kaydı bulunan her bir EmailQueue ürününü ve bir EmailSendFailure kaydı olmayan en az bir EmailContact kaydı almak istiyorum. * DÜZENLEME: Ayrıca, bu sorgudaki EmailContact kayıtlarını eklemek istemiyorum.

var emails2 = 
    (from eqs in 
     this.context.EmailQueues 
     .Include(q => q.EmailContacts) 
     .Include(e => e.EmailEntities) 
    where eqs.EmailContacts.Count > 0 
    && eqs.EmailEntities.Count > 0 
    && eqs.SentFlag == false 
    select new 
    { 
     EmailQueue = eqs, 
     EmailContact = eqs.EmailContacts.Where(c => !c.EmailSendFailures.Any()), 
     EmailEntity = eqs.EmailEntities 
    }).ToList(); 

Sorun şu ki o zaman bir System.Collections.Generic döndürür: *

bazı StackOverflowing ve bazı deneme yanılma sonra ben temelde bu kod ile bu satırlar boyunca bir şey elde etmeyi başardı. Liste < {EmailQueue: Tesa.DataModels.EmailQueue, E-postaİletişim: System.Collections.Generic.IEnumerable, EmailEntity: System.Collections.Generic.IEnumerable}>. Bunu gerçekten istemiyorum. Liste istiyorum.

çalışması gerekir gibi görünüyor, bu çalıştı, ancak bu hatayı alıyorum:

The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties.

List<EmailQueue> emails1 = 
    this.context.EmailQueues.Include(q => q.EmailContacts.Where(c => !c.EmailSendFailures.Any())) 
     .Include(e => e.EmailEntities) 
     .Where(eqs => eqs.EmailContacts.Count > 0 && eqs.EmailEntities.Count > 0 && eqs.SentFlag == false) 
     .ToList(); 

Herkes burada yanlış yapıyor olabilir bir fikrin var? Benim şüphe onu "Pes, ben StackOverflow post ediyorum" dönemine giriyor öncesinde dolayı benim "deneme yanılma" (deneme daha hata) faz sırasında vardı bazı sorunların, navigasyon özelliklerinde bir yerlerde olduğunu .

cevap

0

List<EmailQueue> result = context.EmailQueues.Where(e=>e.EmailEntities.Any() && 
e.EmailContacts.Any(ec=>!ec.EmailSendFailures.Any())).ToList(); 
+0

Daha spesifik olmalıydım. Evet, yazdığım gibi sorumu tatmin ediyor. Sorun şu ki, bir EmailSendFailure kaydı olan EmailContact kayıtlarından herhangi birini dahil etmek istemiyorum. Verilerimde, biri EmailEendFailure kaydı olan iki EmailContact kaydı olan bir EmailQueue kaydım var. Bu kod her ikisini de döndürür. –

+0

veritabanına yeni bir çağrı yapacak her EmailQueue, Varlık çerçeve üzerinde posta kişileri koleksiyonuna gidin eğer bu, Tembel yükleme kullanır, bu sorgu posta kişileri EmailQueue değil döndürür, anlamıyorum "Bu kod her ikisi (EmailContact) döndürür" ve ilgili EmailContacts alacaktır – Tuco

2

ilk ve sonra tüm .includes yapmayı deneyin "Ben EmailSendFailure kaydı yok, en azından bir EmailEntity rekor, ve en az bir EmailContact kayıt yoktur nerede her EmailQueue almak istiyorum" Burada aşağıdaki gibi bir yan tümceleri:

context.Subjects.Include(r => r.RelatedSubjects).Include(t => t.Organisations).Include(y => y.Organisations.Select(i => i.Directories)) 
      .Where(y => y.Organisations.Any(e => e.Status == "Live")); } 
İlgili konular