2015-08-19 55 views
5

我試圖優化一些代碼,但我遇到了一些問題。我有一個數據庫,有問題的表像這樣在EDMX ... enter image description here實體框架 - 填充子對象,過濾子對象的孩子

每個EmailQueue項目可以有多個EmailContact和EmailEntity記錄,每個EmailContact可以有多個EmailSendFailures,雖然大多數都會沒有。

我希望每個EmailQueue至少有一個EmailEntity記錄,並且至少有一個EmailContact記錄沒有EmailSendFailure記錄。 *編輯:另外,我不想在這個查詢中包含這些EmailContact記錄。 *

經過一番StackOverflowing和一些試驗和錯誤,我基本上能夠達到沿着這些線路,此代碼的東西:

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(); 

與問題是,它並返回一個System.Collections.Generic。列表< {EmailQueue:Tesa.DataModels.EmailQueue,EmailContact:System.Collections.Generic.IEnumerable,EmailEntity:System.Collections.Generic.IEnumerable}>。我真的不想那樣。我想要一個List。

這個我試過,這似乎像它應該工作,但我得到這個錯誤:

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(); 

任何人有任何想法,我可能是錯在這裏做什麼?由於我在「試錯」階段(比試驗階段更多的錯誤)階段,在進入「我放棄,我發佈到StackOverflow」階段之前發生的一些問題,我懷疑它在導航屬性中的某處。

回答

0

「我想每個EmailQueue其中至少有一個EmailEntity記錄,以及至少一個EmailContact記錄不具有EmailSendFailure記錄」

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

我應該更具體。是的,這確實滿足了我寫的問題。問題是,我不想包含任何具有EmailSendFailure記錄的EmailContact記錄。在我的數據中,我有一個EmailQueue記錄,其中有兩個EmailContact記錄,其中一個記錄具有EmailSendFailure記錄。這段代碼返回兩者。 –

+0

「這段代碼返回兩個(EmailContact)」,我不明白,這個查詢返回EmailQueue的不是EmailContacts,這個使用Lazy加載,如果你導航到EmailQueue上的EmailContacts集合,Entity框架會執行一個新的對數據庫的調用並將檢索相關的EmailContacts – Tuco

2

先嚐試,然後做所有的.includes where子句喜歡:

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")); }