c# - 通用查询方法

标签 c# generics predicate ormlite-servicestack

尝试通过创建通用 GET 方法来减少我的代码中的重复。我正在使用 OrmLite 及其 SQLExpressionVisitor 更新......目标是传递一个 lambda。我已经看到了一些我希望能有所帮助的其他帖子,但到目前为止,还没有成功......很明显,问题是我如何尝试在 ev.Where 语句中评估标准,但解决方案正在逃避我。 ..

提前致谢... -莱尼

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

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

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

关于c# - 通用查询方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19280628/

相关文章:

java - 使用下限通配符时不兼容的类型

java - Guice 泛型 - 我怎样才能让它不那么难看?

objective-c - 核心数据谓词日期比较

c# - 如何获取 List<of anonymous type> 字段的值(加上转换)?

c# - 正在解析的属性构造函数中的 Unity Inject 参数

generics - Rust 编译器无法推断出有关泛型类型的足够信息

java - 使用 OR 运算符代替 AND 的 QueryDSL

angular - 创建自定义管道以使用 Angular 谓词过滤值

c# - 如何使用 Jquery.ui.datepicker.css 验证带有已故文本框日期的出生日期

c# - 忽略 WPF 应用程序中的 Alt+F4