[英]How to add multiple dynamic conditions or filters into LINQ query.?
我正在获取名称以数字开头的产品列表,但我想应用另外两个过滤器,例如特定的 BranchId 和 isActive。
查询返回名称以数字开头的产品列表。
List<string> searchP = new List<string> { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" };
.....Where(x=> searchP.Any(y=> x.ProductName.StartsWith(x.ProductName))).ToList();
我在自定义FilterCollection
object 命名filters
器中有一个过滤器列表,它具有三个属性filtername
、 operatorname
和filtervalue
。
filters.Add(FilterKey.BranchId, Filteroperator.Equals, 333);
isActive
也是如此,这是我在返回一层之前通过的。
我想获得名称以数字开头并在过滤器中具有BranchId==value
和isActive==filter value
的产品,即true
/ false
。
如果我理解您的问题正确 IsActiv 和 BranchId 是您正在搜索的项目的属性。
在这种情况下,尝试这样的事情:
...Where(x => searchP.Any(y=> x.ProductName.StartsWith(x.ProductName))
&& x.IsActive == true/false && x.BranchId == specificVal).ToList();
我还建议您查看 Regex Patterns 而不是您的起始字符列表。
给定类似的东西:
public enum Filteroperator {
Equals
}
public class Filter {
static public Dictionary<Filteroperator, ExpressionType> mapOperator = new() {
{ Filteroperator.Equals, ExpressionType.Equal }
};
public string propertyName;
public Filteroperator op;
public object value;
public Filter(string p, Filteroperator o, object v) {
propertyName = p;
op = o;
value = v;
}
public Func<T, bool> FilterExpression<T>(IEnumerable<T> _) {
// p =>
var parmP = Expression.Parameter(typeof(T), "p");
// p.{propertyName}
var propE = Expression.Property(parmP, propertyName);
var valE = Expression.Constant(value);
var filterBody = Expression.MakeBinary(Filter.mapOperator[op], propE, valE);
var filterExpr = Expression.Lambda<Func<T,bool>>(filterBody, parmP);
return filterExpr.Compile();
}
}
public class FilterCollection : IList<Filter> {
// ...
}
您可以使用以下方法构建查询:
var q = data.Where(d => searchP.Any(aDigit => d.ProductName.StartsWith(aDigit)));
foreach (var filter in filters)
q = q.Where(filter.FilterExpression(q));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.