泛型查询方法

本文关键字:方法 查询 泛型 | 更新日期: 2023-09-27 18:34:34

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

提前感谢...-莱尼

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

这是我得到的错误...类型为"TW"的变量"x"。从范围"引用的 Api.Models.CostCenter",但未定义

下面是一个有效但不是通用的代码示例。

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

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

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

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

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

泛型查询方法

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

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