如何在nhibernate中的谓词查询中使用方法作为谓词



我在存储库中有一个方法,在那里我实现了一个返回所有未结订单转移的方法

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);
}
}

相关内容

  • 没有找到相关文章

最新更新