Nhibernate.Linq:用Where(Expression <Predicate >)限制查询结果

我使用NHibernate查询我的数据库。 现在我需要使用谓词限制所选数据。 到目前为止,我发现(Google驱动开发的最佳状态)使用Expressions和NHibernate.Linq可以实现这样的function。

这是我尝试过的:

public IList GetAll(Predicate predicate) { Expression<Func> restriction = x => predicate(x); ISession session = SessionService.GetSession(); IList bestellungen = session.Query() .Where(restriction).ToList(); return bestellungen; } 

这导致无法将类型为’NHibernate.Hql.Ast.HqlCast’的对象转换为’NHibernate.Hql.Ast.HqlBooleanExpression’ 。 只需快速检查它的位置:将方法体的第一行更改为

 Expression<Func> restriction = x => x.Id!=1; 

令人惊叹的结果是一切正常。

如何在表达式中执行我的Predicate?

你不能 – 至少不容易 。 NHibernate(作为EF和LINQ to SQL)解释表达式并将其转换为SQL。 NHibernate根本不知道如何将谓词转换为SQL。

实现它的一种方法是用Expression>替换Predicate本身:

 public IList GetAll(Expression> restriction) { ISession session = SessionService.GetSession(); IList bestellungen = session.Query() .Where(restriction).ToList(); return bestellungen; } 

重要:
调用此方法的代码仍然与以前一样:

 var orders = GetAll(x => x.Id != 1);