繁体   English   中英

如何在 LINQ 查询中添加多个动态条件或过滤器。?

[英]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器中有一个过滤器列表,它具有三个属性filternameoperatornamefiltervalue

filters.Add(FilterKey.BranchId, Filteroperator.Equals, 333); isActive也是如此,这是我在返回一层之前通过的。

我想获得名称以数字开头并在过滤器中具有BranchId==valueisActive==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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM