我在存储库中有一个方法,在那里我实现了一个返回所有未结订单转移的方法
public async Task<IList<OrderShift>> GetAllOpenOrderShift()
{
return await GetAllAsync(a => a.Status == OrderShift.ShiftOpen).ConfigureAwait(false);
}
我在实体中也有create方法像
public virtual bool IsOpen()
{
return Status == ShiftOpen;
}
但是当我尝试在谓词中使用method时,我会出现类似的错误
InvalidOperationException: Unrecognised method call: App/Entity/OrderShift : Boolean IsOpen()
在那个些repo方法中,我怎么能用method作为谓词呢。
最近,我使用了一个很好的解决方案,但要在谓词查询中实现多个条件,我应该在实体中创建表达式吗?或者我应该怎么做?
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);
}
}