我有一个存储库接口,它定义了以下方法:
IEnumerable<T> GetMany(Expression<Func<T, bool>> where);
我已经实现了两个几乎相同的存储库来实现这个接口。我的第一个存储库使用实体框架。它实现上述方法:
private readonly IObjectSet<T> _objectSet;
public IEnumerable<T> GetMany(Expression<Func<T, bool>> whereExpression)
{
return _objectSet.Where(whereExpression);
}
当我运行我的程序时,我可以看到上面的方法成功地将'whereExpression'转换为SQL,并且查询只返回与我的whereExpression匹配的实体。
我的第二个存储库使用NHibernate并按如下方式实现该方法:
private readonly ISession _context;
public IEnumerable<T> GetMany(Expression<Func<T, bool>> whereExpression)
{
return _context.Query<T>().Where(whereExpression);
}
但上述方法无效。我的查询什么都没有。当我使用NHibernate时,它并不像我生成任何SQL那样。任何人都可以解释我如何使用NHibernate来实现这一点?最终,我希望能够将where子句传递给存储库,并让NHibernate将其转换为SQL。
另外,我读到我需要使用Expression&gt;而不是只是Func实现这一点。我可以使用Func成功地使用它,但它似乎从数据库加载每个记录并在之后应用whereExpression。这意味着我加载的实体远远多于实际需要的实体。我对此的理解是否正确?
***编辑原始帖子
这很奇怪,但我刚刚通过更改whereExpression来实现这一点。我被要求查询返回ID为偶数的所有实体:
var results = productRepository.GetMany(a => a.Id % 2 == 0);
我将其更改为:
var results = productRepository.GetMany(a =&gt; a.Price&gt; 0m);
它立刻起作用了。所以这看起来像是试图查询实体的ID。我正在为NHibernate使用HiLo ID生成器。知道为什么我不能查询ID值吗?
* *另一个编辑
这也不起作用:
var results = productRepository.GetMany(a => a.UnitsInStock % 2 == 0);
然而这样做:
var results = productRepository.GetMany(a => a.UnitsInStock > 400 == 0);
库存中的单位只是一个整数列。在我看来,modulo运算符不能与NHibernate和Linq一起使用。
答案 0 :(得分:0)
您必须调用ToFuture()或ToList()以获取数据库中的实际获取数据。
private readonly ISession _context;
public IEnumerable<T> GetMany(Expression<Func<T, bool>> whereExpression)
{
return _context.Query<T>().Where(whereExpression).ToFuture();
}
或
private readonly ISession _context;
public IEnumerable<T> GetMany(Expression<Func<T, bool>> whereExpression)
{
return _context.Query<T>().Where(whereExpression).ToList();
}
<强>已更新强>
根据更新的信息:这是针对NHibernate提供程序实现的linq的限制。