2011-05-17 191 views
0

希望有人能幫助解決這個問題!通過子實體上的屬性過濾聚合根實體和子實體

我給出一個基於標準Order-> OrderLine-> Product的例子,而不是實際的情況來使它更容易解釋!

基本上,我想運行一個查詢,返回所有包含電視訂單行的訂單。很簡單:

IEnumerable<Order> orders; 
      using (var context = new DataContext()) 
      { 
       var source = 
        context.Orders.Include("OrderLines").Include(
         "OrderLines.Product"); 

       orders= source.Where(o => o.OrderLines.Where(ol => ol.Product.Name == "TV")).ToList(); 
      } 
      return orders; 

這個作品在這個意義上,我得到令實體的正確收集,但是當我在每一個訂單的集合OrderLines的使用看它包含所有 OrderLines不僅僅是那些含電視。

希望是有道理的。

預先感謝任何幫助。

回答

1

我的確很有意義,因爲查詢符合您的原始標準「返回所有包含電視的訂單行的訂單」,每個訂單當然會包含所有訂單項。該過濾器僅用於選擇訂單,而不是OrderLines。

檢索剛剛從你再次使用過濾器訂單包含電視OrderLines,即:

var OrderLinesWithTV = order.OrderLines.Where(ol => ol.Product.Name == "TV"); 
+0

感謝您的回答。是否有任何方法可以在一個語句中過濾所有訂單的OrderLines,而是循環處理訂單集合並過濾每個單獨的訂單行? – Gareth 2011-05-18 08:58:19

+0

我可以考慮接近你所擁有的狀態的唯一方法是直接從OrderLines集合中檢索所有帶有「TV」的OrderLines(對於OrderLines的整個實體集合,與Order沒有關係,即'dbContext.OrderLines.Where ol => ol.Product.Name ==「TV」)'),然後逐步升級到每個訂單。就像SQL查詢中的表格數據一樣,您將看到許多OrderLines的相同Order,並且如果使用了'ReturnedOrderLine.Order.OrderLines',那麼您將看到該Order的全部OrderLines。問題在於你正在向查詢應用過濾器而不是結果。 – Lazarus 2011-05-18 09:52:52

+0

最終爲兩個階段的過程進行了檢索,檢索所有訂單項次的匹配訂單,然後遍歷每個訂單,並將訂單過濾到感興趣的訂單項。這似乎有點低效,因爲我從數據庫獲取的數據比我需要的還多,然後在內存中對其進行過濾,但它起作用!謝謝您的幫助。 – Gareth 2011-05-20 08:26:46

1

主要的一點是要知道,如果你需要保持(或沒有)的一個參考在過濾的行中訂購標題。 也就是說你想要所有的訂單與電視的清單,更確切地說只有他們的電視線?或者你想要所有的電視線路都不要他們的訂單頭?

您似乎更喜歡第一個選項。 那麼最好的解決方案肯定會

var relevantOrders = orders.Where(order => order.OrderLines.Any(ol => ol.Product.Name == "TV")) 

來獲得相關訂單,然後,每個訂單在relevantOrders:

order.OrderLines.Where(ol => ol.Product.Name == "TV") 

不僅要考慮電視線。

其他技術會導致信息丟失或迫使您建立一個與初始訂單集合類似的新訂單集合,但在標題和行上進行雙重過濾,這似乎相當糟糕,只要優雅和表現是關心。