2013-10-17 91 views
1

我被困在一個linq到實體查詢的問題中。實體框架忽略任何子句

我有3個表格:TransactionSecurityPrices

導航如下: 事務有哪些可以有很多價格

我想要做的就是與安全信息交易,所有的價格,其日期是少了一個安全交易日期。

我寫的查詢是這樣的:

context.Transaction 
    .Include("Security.Prices") 
    .Where(transaction => 
     transaction.Security.Prices.Any(price => price.Date < transaction.Date)) 
    .ToList(); 

此查詢的結果是不是我所期望,的foreach交易我總是得到安全的所有價格,而不只是有價格一個小於交易日期的日期。

我試過的Anthor事情是顛倒查詢試圖獲取安全性的所有事務,filterning上的安全代碼和userid列表。但即使是這一次的任何過濾器被忽略

context.Security 
    .Include("Transactions") 
    .Where(security => security.Code == code) 
    .Where(s => s.Transactions.Any(t => Ids.Contains(t.Id))) 
    .ToList(); 

有了這個代碼,我得到的所有事務由所有用戶,而不僅僅是用戶的ID列表中進行的安全性。

我不明白我在做這個查詢有什麼問題嗎?

+0

我不是目前的EF專家,但不包括與凡在不同的數據和問題的部分工作?包含說「包含您返回的事務的這些數據」,以及Where說「我想要這些事務」。如果在哪裏神奇地應用於包含部分,我會覺得很奇怪。 Where部分僅過濾*交易*,而不是價格。 –

+3

換句話說,您應該只獲得交易日期前的價格的交易,但您將獲得與該交易相關的所有價格。 –

回答

3

Like @Lasse評論,你選擇所有Transaction s有任何價格與交易日期之前的日期。結果集包括全部每筆交易的價格。你會想在一個新的結果集來過濾那些Select()

context.Transaction 
     .Include("Security.Prices") 
     .Where(transaction => 
      transaction.Security.Prices.Any(price => price.Date < transaction.Date)) 
     .Select(t => new Transaction 
     { 
      // Only select prices before the given date 
      Prices = t.Prices.Where(price => price.Date < transaction.Date), 
      OtherProperty = t.OtherProperty, 
      // etc... 
     }) 
     .ToList(); 
+0

謝謝你們, 我給了另一個解釋我寫的代碼,我認爲它會做這樣的事情: SELECT * FROM交易牛逼 內上加入證券小號s.Isin = t.Isin 內部連接價格p上p.Isin = s.Isin 其中p.Date Raphael