实体框架忽略任何子句

时间:2013-10-17 06:36:19

标签: c# linq entity-framework

我遇到了linq to entity query的问题。

我有3个表:TransactionSecurityPrices

导航如下: 交易有一个可以有很多价格的证券

我要做的是获取一份包含安全信息的交易以及日期少于交易日期的所有价格。

我写的查询是:

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

此查询的结果不是我所期望的,foreach交易我总是获得证券的所有价格,而不仅仅是日期小于交易日期的价格。

我试过的Anthor事情是反转查询,试图获取安全性的所有事务,对安全代码和userid列表进行过滤。但即使这次任何过滤器都被忽略

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

使用此代码,我获得了所有用户的安全交易,而不仅仅是Ids列表中的用户。

我无法理解我对此查询的错误是什么?

1 个答案:

答案 0 :(得分:3)

与@Lasse评论一样,您选择的所有Transaction具有任何价格,并且具有交易日期之前的日期。结果集将包括每个事务的所有价格。您需要在新结果集中按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();