使用Expression <func,t =“”>&gt;的NHibernate查询不工作</func,>

时间:2011-08-13 15:50:24

标签: c# .net nhibernate entity-framework

我有一个存储库接口,它定义了以下方法:

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一起使用。

1 个答案:

答案 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的限制。