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一起工作。

NHibernate查询使用Expression< function, T>>不工作

必须调用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提供程序实现的限制