通用查询方法

Len*_*nny 6 c# generics predicate ormlite-servicestack

尝试通过制作通用GET方法来减少代码中的重复.我正在使用OrmLite及其SQLExpressionVisitor更新...目标是传入lambda.我已经看过其他一些我希望会有所帮助的帖子,但到目前为止,没有去......显然问题是我如何在ev.Where声明中尝试评估标准,但解决方案正在逃避我. ..

提前谢谢...... -Lenny

public IQueryable<T> Get<T>(Predicate<T> criteria)
{
  using (IDbConnection db = dbConnectionFactory.OpenDbConnection())
    {
     SqlExpressionVisitor<T> ev = OrmLiteConfig.DialectProvider.ExpressionVisitor<T>();
     ev.Where(x => criteria.Invoke(x))
     return db.Select(ev).AsQueryable();
    }
 }
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误......从范围''引用的'TW.Api.Models.CostCenter'类型的变量'x',但它没有定义

这是一个有效但不通用的代码示例....

public IQueryable<CostCenter> Get(Identity user)
{
    using (IDbConnection db = dbConnectionFactory.OpenDbConnection())
      {
        SqlExpressionVisitor<CostCenter> ev = OrmLiteConfig.DialectProvider.ExpressionVisitor<CostCenter>();
        ev.Where(x => x.OrgId == user.OrgId);
        ev.Where(x => x.VisibilityStockpointId == user.StockpointId);``
        return db.Select(ev).AsQueryable();
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我上面引用的模型......

[Alias("CostCenterDetail")]
public class CostCenter
{
    public Guid Id { get; set; }
    public Guid StockpointId { get; set; }
    public virtual Guid? VisibilityStockpointId { get; set; }
    public string Description { get; set; }
    public string Number { get; set; }
    public string OrgId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所有阅读本文,这是最终的代码......

    public IQueryable<T> Get<T>(Expression<Func<T, bool>> criteria)
{
    using (IDbConnection db = dbConnectionFactory.OpenDbConnection())
    {
        return db.Select(criteria).AsQueryable();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jeh*_*hof 2

您需要使用 anExpression<Func<T, bool>>而不是 aPredicate<T>作为泛型方法的参数。

public IQueryable<T> Get<T>(Expression<Func<T, bool>> criteria) {
    using (IDbConnection db = dbConnectionFactory.OpenDbConnection())
    {
        return db.Select(criteria).AsQueryable();
    }
}
Run Code Online (Sandbox Code Playgroud)