如何在 nhibernate 的谓词查询中使用方法作为谓词
How to use method as predicate in the in Predicate Query in nhibernate
我在存储库中有一个方法,我在其中实施了一个方法,return 所有未结订单转移
public async Task<IList<OrderShift>> GetAllOpenOrderShift()
{
return await GetAllAsync(a => a.Status == OrderShift.ShiftOpen).ConfigureAwait(false);
}
我在实体中也有创建方法
喜欢
public virtual bool IsOpen()
{
return Status == ShiftOpen;
}
但是当我尝试在谓词中使用方法时,出现类似
的错误
InvalidOperationException: Unrecognised method call: App/Entity/OrderShift : Boolean IsOpen()
如何在那些回购方法中使用方法作为谓词。
最近我使用了工作正常但在谓词查询中实现多个条件的解决方案,我应该在实体中创建表达式还是我应该做什么?
public async Task<OrderShift?> GetShiftByStartingUserId(long userId)
{
return await CurrentSession.QueryOver<OrderShift>()
.Where(a => userId == a.StartedByUserId && a.Status == OrderShift.StatusOpen).SingleOrDefaultAsync();
}
提供者必须能够将表达式树转换为SQL;通常不支持用户定义的方法。
但是,您可以这样做:
class Repository
{
public async Task<IList<OrderShift>> GetAllOpenOrderShift()
{
return await GetAllAsync(OrderShift.IsOpenExpression).ConfigureAwait(false);
}
}
public class OrderShift()
{
internal static Expression<Func<OrderShift, bool>> IsOpenExpression =>
a => a.Status == ShiftOpen;
public virtual bool IsOpen()
{
return IsOpenExpression.Compile()(this);
}
}
我在存储库中有一个方法,我在其中实施了一个方法,return 所有未结订单转移
public async Task<IList<OrderShift>> GetAllOpenOrderShift()
{
return await GetAllAsync(a => a.Status == OrderShift.ShiftOpen).ConfigureAwait(false);
}
我在实体中也有创建方法 喜欢
public virtual bool IsOpen()
{
return Status == ShiftOpen;
}
但是当我尝试在谓词中使用方法时,出现类似
的错误InvalidOperationException: Unrecognised method call: App/Entity/OrderShift : Boolean IsOpen()
如何在那些回购方法中使用方法作为谓词。
最近我使用了工作正常但在谓词查询中实现多个条件的解决方案,我应该在实体中创建表达式还是我应该做什么?
public async Task<OrderShift?> GetShiftByStartingUserId(long userId)
{
return await CurrentSession.QueryOver<OrderShift>()
.Where(a => userId == a.StartedByUserId && a.Status == OrderShift.StatusOpen).SingleOrDefaultAsync();
}
提供者必须能够将表达式树转换为SQL;通常不支持用户定义的方法。
但是,您可以这样做:
class Repository
{
public async Task<IList<OrderShift>> GetAllOpenOrderShift()
{
return await GetAllAsync(OrderShift.IsOpenExpression).ConfigureAwait(false);
}
}
public class OrderShift()
{
internal static Expression<Func<OrderShift, bool>> IsOpenExpression =>
a => a.Status == ShiftOpen;
public virtual bool IsOpen()
{
return IsOpenExpression.Compile()(this);
}
}