2009-12-10 78 views
0

我試圖讓實體框架選擇一個對象,並在同一時間過濾它的集合。我有一個JobSeries對象,它有一個作業集合,我需要做的是通過ID選擇一個工作系列,並通過SendDate篩選所有作業,但我不敢相信這個簡單查詢有多困難!Linq過濾器集合與EF

這是工作的基本查詢:

var q = from c in KnowledgeStoreEntities.JobSeries 
        .Include("Jobs.Company") 
        .Include("Jobs.Status") 
        .Include("Category") 
        .Include("Category1") 
       where c.Id == jobSeriesId 
       select c; 

任何幫助,將不勝感激,我一直在試圖找到谷歌的東西,我想要做的是在這裏:http://blogs.msdn.com/bethmassi/archive/2009/07/16/filtering-entity-framework-collections-in-master-detail-forms.aspx

這是在VB.NET中,但我無法將其轉換爲C#。

編輯:我現在已經嘗試這樣做,這是行不通的!:

  var q = from c in KnowledgeStoreEntities.JobSeries 
             .Include("Jobs") 
             .Include("Jobs.Company") 
             .Include("Jobs.Status") 
             .Include("Category") 
             .Include("Category1") 
        where (c.Id == jobSeriesId & c.Jobs.Any(J => J.ArtworkId == "13")) 
        select c; 

感謝

+1

你能解釋一下「過濾」的含義嗎?你想在一定的日期範圍內的對象? – 2009-12-10 15:19:28

+1

基本上我想選擇一個JobSeries,其中id = 1,並從Job的子集合中選擇Job.SendDate = 01/12/2009。謝謝 – Dan 2009-12-10 15:43:30

回答

8

Include可能會引入性能問題。延遲加載是保證引入性能問題。投影便宜又容易:

var q = from c in KnowledgeStoreEntities.JobSeries 
     where c.Id == jobSeriesId    
     select new 
     { 
      SeriesName = c.Name, 
      Jobs = from j in c.Jobs 
        where j.SendDate == sendDate 
        select new 
        { 
         Name = j.Name 
        } 
      CategoryName = c.Category.Name 
     }; 

顯然,我在猜名字。但是請注意:

  1. 過濾工作。
  2. SQL is much更簡單。
  3. 任何地方都沒有無類型的字符串。
  4. 您始終可以獲得所需的數據,而無需在兩個地方(Include和其他地方)指定它。
  5. 沒有帶寬處罰檢索你不需要的列。在EF
  6. 免費的性能提升4

,關鍵是要覺得在LINQ,而不是SQL或者,你會與舊的ORM物化整個實體沒有很好的理由。

+3

+1最後一句 – mkedobbs 2009-12-10 21:57:44

+1

這是一個很好的答案,非常豐富,但對我來說不太合適,因爲我不想返回一個匿名對象,我需要一個JobSeries對象,並且過濾作業。最終的結果 我發現了一個VB.NET例如: 昏暗查詢=從c在db.Customers _ 凡c.CustomerID = 1 _ 選擇客戶= C,_ 訂單=由鄰在c.Orders _ 哪裏o.OrderDate> =#1/1/2009# 我想我對EF沒有足夠的經驗,而且我討厭這個事實,那麼簡單的事情讓我覺得很累!在這個實驗後回到流利的NHibernate! – Dan 2009-12-11 11:27:59

+2

這聽起來像你想要使用EF,就好像它是NHibernate一樣。這將永遠不會工作,因爲NHibernate使用(有點古老,恕我直言)不同的工作方式,因爲它多年來一直沒有LINQ支持,在該部門仍然非常有限。你不必在這裏使用匿名類型;常規的POCOs可以正常工作,但是如果你的代碼完全依賴於獲取實體類型,那麼你幾乎可以保證在任何工具中做太多的SQL,因爲通常在實體上有更多的屬性比你需要的更多操作。 – 2009-12-11 13:33:17