2012-08-13 132 views
1

我在聯繫人和列表之間的EF Code First中有多對多的關係。 ProxyCreation和LazyLoading被禁用以允許實體的序列化。實體框架多對多過濾器

我有一個查詢是爲了返回給定列表中的聯繫人。

// GET api/Contacts 
     [Queryable] 
     public IQueryable<Contact> GetContacts(int bulkListId) 
     { 
      var bulkList = db.BulkLists.Include(c => c.Contacts).Where(c => c.ID == bulkListId).SingleOrDefault(); 

      if (bulkList == null) 
       throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound)); 

      return bulkList.Contacts.AsQueryable().OrderBy(c => c.ID).Include(c => c.AddressBookType).Include(c => c.BulkLists); 
     } 

雖然這可行,但它不能按預期工作。它導致正確的聯繫人集合在給定列表中,但這些聯繫人僅在關係的Lists屬性中填充了該列表。所以當這個序列化並返回到客戶端時,它隱藏了聯繫人所屬的其他列表。

我看不到查詢是如何以這種方式對它進行過濾以及如何將其更改爲包含完整的列表集。任何建議將非常感激。

回答

1

你在作弊! :)

通過將AsQueryable()添加到bulkList.Contacts您可以在不使編譯器抱怨的情況下繼續使用Include。但是...

作爲每MSDN on DbExtensions.Include

此擴展方法調用的IQueryable源對象的包含(String)方法,如果這樣的方法存在。如果源IQueryable沒有匹配的方法,那麼這個方法什麼也不做。

(重點煤礦)

而且EntityCollection不具有Include方法,所以什麼也沒發生。

你必須擴大包括列表中的第一條語句,大概就像這樣:

db.BulkLists 
    .Include(c => c.Contacts.Select(c => c.AddressBookType)) 
    .Include(c => c.Contacts.Select(c => c.BulkLists)) 
+1

驚人,沒想到嵌套查詢的那樣。我認爲EF查詢可能比他們實際上更脆弱。 @ - } - 花給你:P – 2012-08-14 09:32:41

+0

謝謝 - 漂亮的表情! – 2012-08-14 09:47:35