默认排除条件和扩展以将它们包含回来
本文关键字:包含 回来 排除 条件 扩展 默认 | 更新日期: 2023-09-27 18:05:15
我有一个附加到某个数据源的存储库。它有一个方法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
默认情况下,我想只返回未删除的记录,但扩展方法,我想显示已删除和未删除。
一个可能的解决方案是创建这样的标准类:
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;
}
优势:
方便添加/删除标准
容易打开/关闭标准<-你需要这个
Criteria类可以支持大量的规则
不是一个非常通用的解决方案,但您可以返回查询的原始数据源,这将有效地让您重新开始查询:
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();
}
更好的选择是更新表达式树,但这超出了我的能力范围。