我使用NHibernate查询我的数据库。现在我需要使用谓词来限制所选择的数据。到目前为止,我发现(Google驱动开发的最佳状态)使用Expressions和NHibernate.Linq可以实现这样的功能。
这是我试过的:
public IList<Bestellung> GetAll(Predicate<Order> predicate)
{
Expression<Func<Order, bool>> restriction = x => predicate(x);
ISession session = SessionService.GetSession();
IList<Order> bestellungen = session.Query<Order>()
.Where(restriction).ToList();
return bestellungen;
}
这会导致无法将'NHibernate.Hql.Ast.HqlCast'类型的对象强制转换为'NHibernate.Hql.Ast.HqlBooleanExpression'。只需快速检查它的位置:将方法体的第一行更改为
Expression<Func<Order, bool>> restriction = x => x.Id!=1;
令人惊叹的结果是一切正常。
如何在表达式中执行我的Predicate?
答案 0 :(得分:6)
你不能 - at least not easily。 NHibernate(作为EF和LINQ to SQL)解释表达式并将其转换为SQL。 NHibernate根本不知道如何将谓词转换为SQL。
实现目标的一种方法是将Predicate<T>
本身替换为Expression<Func<T, bool>>
:
public IList<Bestellung> GetAll(Expression<Func<Order, bool>> restriction)
{
ISession session = SessionService.GetSession();
IList<Order> bestellungen = session.Query<Order>()
.Where(restriction).ToList();
return bestellungen;
}
重要:
调用此方法的代码仍然与以前一样:
var orders = GetAll(x => x.Id != 1);