我試圖優化一些代碼,但我遇到了一些問題。我有一個數據庫,有問題的表像這樣在EDMX ... 實體框架 - 填充子對象,過濾子對象的孩子
每個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」階段之前發生的一些問題,我懷疑它在導航屬性中的某處。
我應該更具體。是的,這確實滿足了我寫的問題。問題是,我不想包含任何具有EmailSendFailure記錄的EmailContact記錄。在我的數據中,我有一個EmailQueue記錄,其中有兩個EmailContact記錄,其中一個記錄具有EmailSendFailure記錄。這段代碼返回兩者。 –
「這段代碼返回兩個(EmailContact)」,我不明白,這個查詢返回EmailQueue的不是EmailContacts,這個使用Lazy加載,如果你導航到EmailQueue上的EmailContacts集合,Entity框架會執行一個新的對數據庫的調用並將檢索相關的EmailContacts – Tuco