我使用 NHibernate 查询数据库。现在我需要使用谓词限制选择的数据。到目前为止,我发现(Google 驱动的开发处于最佳状态)使用表达式和 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;
令人惊叹的结果是一切正常。
如何在表达式中执行我的谓词?
你不能-至少不容易 https://stackoverflow.com/questions/9802269/convert-predicatet-to-expressionfunct-bool。 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)