默认排除条件和扩展名以包含它们

时间:2015-07-29 11:43:05

标签: c# .net linq

我有一个附加到某些数据源的存储库。它有一个方法GetAll(),它返回可查询的列表和扩展名来过滤这些数据。

public class Repository {
    int[] dataSource = new[] {0,1,1,1,0,0,0,0,1};

    public IQueryable<int> GetAll()
    {
        return dataSource.AsQueryable();
    }
}

public static class ExtensionClass
{
    public static IQueryable<int> WithoutZero(this IQueryable<int> list)
    {
        return list.Where(x => x != 0);
    }
}

我想在存储库上设置默认条件,默认情况下不读取0值。此外,我希望有扩展方法,以便同时读取0值。

public class Repository {
    int[] dataSource = new[] {0,1,1,1,0,0,0,0,1};

    public IQueryable<int> GetAll()
    {
        return dataSource.AsQueryable().Where(x => x != 0);
    }
}

public static class ExtensionClass
{
    public static IQueryable<int> WithZero(this IQueryable<int> list)
    {
        ...
    }
}

我知道我可以使用GetAll()方法上的默认参数执行此操作,如:

public IQueryable<int> GetAll(bool readZeros = false)
{
    if (readZeros)
    {
        return dataSource.AsQueryable();
    } else {
        return dataSource.AsQueryable().Where(x => x != 0);
    }
}

但我想知道如何使用扩展方法和Queryable<>集合来做到这一点?

例如,在Repository默认情况下,我想只返回未删除的记录,但是使用扩展方法我希望同时显示已删除和未删除的记录。

2 个答案:

答案 0 :(得分:2)

一种可能的解决方案是创建这样的标准类:

  public class ItemsCriteria {
      public bool RemoveZeroes {get;set;}
  }

然后,在您的存储库类中使用它:

    public IQueryable<int> GetItems(ItemsCriteria  criteria)
    {
        var q = GetAllDataQueryable();
        if (criteria.RemoveZeroes) q = q.Where(x => x != null)
        return q;
    }

优点:

  • 易于添加/删除标准

  • 轻松打开/关闭标准&lt; - 你需要这个

  • Criteria类可以支持大量规则

答案 1 :(得分:0)

这不是一个非常通用的解决方案,但您可以返回查询的原始数据源,这将有效地让您再次从头开始查询:

public static IQueryable<int> WithZeros(this IQueryable<int> list)
{
    var expr = list.Expression as MethodCallExpression;
    var constantExpr = expr.Arguments.OfType<ConstantExpression>().First(x => x.Value is IEnumerable<int>);
    var origDataSource = constantExpr.Value as IEnumerable<int>;

    return origDataSource.AsQueryable();
}

更好的选择是更新表达式树,但这超出了我的范围。