NHibernate查询使用Expression< function, T>>不工作
本文关键字:工作 function 查询 Expression NHibernate | 更新日期: 2023-09-27 18:05:23
我有一个存储库接口,它定义了以下方法:
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>而不是仅仅使用Func来实现它。我可以成功地得到这个工作使用Func,但它似乎从数据库加载每条记录,然后应用whereExpression。这意味着我加载的实体比我实际需要的要多得多。我的理解对吗?
***编辑原文章
这很奇怪,但我只是通过改变我的whereExpression来让它工作。我被要求查询返回ID为偶数的所有实体:
var results = productRepository.GetMany(a => a.Id % 2 == 0);
我把它改成:
var results = productrerepository。GetMany(a => a. price> 0);
它立即起作用了。因此,这看起来像是由于试图查询实体的ID而导致的。我正在使用NHibernate的HiLo ID生成器。知道为什么我不能查询ID值吗?
* *另一个编辑
这个也不能用:
var results = productRepository.GetMany(a => a.UnitsInStock % 2 == 0);
var results = productRepository.GetMany(a => a.UnitsInStock > 400 == 0);
库存单位只是一个整数列。在我看来,模运算符不与NHibernate和Linq一起工作。
必须调用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();
}
根据更新的信息:这是linq对NHibernate提供程序实现的限制