【问题标题】:How to add multiple dynamic conditions or filters into LINQ query.?如何在 LINQ 查询中添加多个动态条件或过滤器。?
【发布时间】:2020-12-10 10:21:41
【问题描述】:

我正在获取名称以数字开头的产品列表,但我想应用另外两个过滤器,例如特定的 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();

我在名为filters 的自定义FilterCollection 对象中有一个过滤器列表,它具有三个属性filternameoperatornamefiltervalue

filters.Add(FilterKey.BranchId, Filteroperator.Equals, 333);isActive 一样,这是我在上一层之前通过的。

我想获取名称以数字开头并在过滤器中有BranchId==valueisActive==filter valuetrue / false 的产品。

【问题讨论】:

  • “我在自定义 FilterCollection 对象中有一个过滤器列表,名为“filters”,它有三个参数,”代码告诉我们的不仅仅是描述。可以发一下吗?
  • @MongZhu FilterCollection filters.....filter.Add(FilterKey.BranchId, Filteroperator.Equals, 333); isActive 一样,这是我在一层返回之前通过的..
  • @MongZhu 已添加。
  • stackoverflow.com/questions/65193835/… 只需将Contains 替换为StartsWith
  • @SvyatoslavDanyliv 我正在获取名称以数字开头的列表或产品,但我需要再添加两个过滤器,这些过滤器在 FilterCollections 的对象中可用。

标签: c# linq linq-to-sql linq-to-entities


【解决方案1】:

如果我理解您的问题正确,IsActiv 和 BranchId 是您正在搜索的项目的属性。

在这种情况下,请尝试以下操作:

...Where(x => searchP.Any(y=> x.ProductName.StartsWith(x.ProductName)) 
          && x.IsActive == true/false && x.BranchId == specificVal).ToList();

我还建议您查看 Regex Patterns 而不是您的起始字符列表。

【讨论】:

  • 但是我在filter[i].FilterValue 中有值,如果我尝试像这样写x.BranchId== filters[0 or 1].FilterValue.FirstOrDefault()).ToList(); 我得到了一个例外......FilterTuple get_Item(Int32) 方法并且这个方法不能被翻译成商店表达。
  • 我建议您查看 NetMages 的答案,根据您的第一个描述,我假设了不同的结构。
【解决方案2】:

鉴于类似:

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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    相关资源
    最近更新 更多