2016-10-10 138 views
3

我正在使用實體框架。我的典型訪問功能是這樣的:Linq SelectMany in Entity Framework

public IEnumerable<Product> Category(string category, int term) 
    { 
     using (var uow = new UnitOfWork(Connections.LoanComparision)) 
     { 
      var r = new Repository<Product>(uow.Context); 

      return r.Find(x => x.Category == category) 
       .Include(x => x.ProductDetails) 
       .Include(x => x.ProductRates) 
       .Include(x => x.Provider) 
       .ToList(); 
     } 
    } 

你會從上面的代碼注意到2件事情。

  • 查詢返回一個產品列表,其中包含鏈接的 實體。
  • 每個產品都有許多ProductDetail行。

我想要做的(並且還沒有能夠解決的)是在ProductDetails表上應用選擇標準。 (我的函數)可以用標準的.Where子句替換,但是我需要在MinTerm和MaxTerm(它在ProductDetails中)上過濾,但仍然返回完整的Product數據集(包括鏈接的實體) ,而不僅僅是ProductDetails。

Where(x => term >= x.MinTerm && term <= x.MaxTerm) 

我可以計算出如何通過第一參考產品詳細和鏈接到其他表做,但不能在此配置。可能嗎?

+0

否。解決這個問題,你應該返回一個'IEnumerable '或使用自定義類型和投影。 –

+0

只需加入產品的產品細節進行過濾,然後選擇您需要的一切 –

+0

@KonstantinErshov - 不完全理解,請您澄清。 –

回答

1

如果ProductProductDetail之間的關係是一對多的,你可以這樣做:

var query= context.ProductDetails.Include(pd=>pd.Product.ProductRates) 
           .Include(pd=>pd.Product.Provider) 
           .Where(pd=> pd.Product.Category == category 
              && term >= pd.MinTerm && term <= pd.MaxTerm); 

如果你想要的產品列表中,你可以做到以下幾點:

var query1=query.Select(pd=>pd.Product).Distinct().ToList(); 
+0

沿着我的替代選項的路線,但我沒有制定出獨特的,但。很簡約。 –

+0

但是這樣的事情是你在找什麼?我還沒有理解你期待的結果是什麼。你能否在你的問題上澄清更多? – octavioccl

+0

該函數是一個比較表,所以在第一個例子中,我將尋找檢索符合條件的產品(還有更多)。因爲,數據是相當靜態的,不是太大,我正在尋找可能緩存它,然後可以用於其他查詢。 –