如何使用多个'Where'表达式,并使用C#/。NET将它们与AND和OR链接在一起?

PTK

我正在尝试在Web应用程序中创建一个过滤系统。问题是我不知道从客户端向API请求多少个过滤器。我已经构建好了,所以过滤器的数组来自像这样的单个字符串:?sizeFilters=big,small,medium

然后我用一个string[] names = sizeFilters.Split(',');来获得像Where(x => x.listOfSizes.contains(names[index]));

我还需要使用AND和OR来制作表达式的链,因为我将使用另一个过滤器,例如: '?typeFilters=normal,extra,spicy'

因此,我需要使整个表达式看起来像这样,但可能要长几倍,并且需要使用不同大小的数组:

退换货品 Where size is big OR small OR medium AND Where type is normal OR extra OR spicy

Where(x => x.Sizes == "Small" || x => x.Sizes == "Medium" || x => x.Sizes == "Big" && 
x => x.Types == "normal" || x => x.Types == "extra" || x => x.Types == "Spicy")
泽夫·斯皮兹(Zev Spitz)

正如其他人所指出的那样,最简单的选择是在表达式中OR使用构建您Enumerable.ContainsAND通过Where多次调用来构建

// using these values as an example
string[] sizeTerms = /* initialize */;
string[] typeTerms = /* initialize */;

IQueryable<Item> items = /* initialize */
if (sizeTerms.Any()) {
    items = items.Where(x => sizeTerms.Contains(x.Size));
}
if (typeTerms.Any()) {
    items = items.Where(x => typeTerms.Contains(x.Type));
}

如果需要,可以将此逻辑包装到扩展方法中,该方法接受要过滤的表达式,并IEnumerable<string>为过滤器值添加;并构造并应用该Contains方法:

// using System.Reflection
// using static System.Linq.Expressions.Expression

private static MethodInfo containsMethod = typeof(List<>).GetMethod("Contains");

public static IQueryable<TElement> WhereValues<TElement, TFilterTarget>(
        this IQueryable<TElement> qry, 
        Expression<Func<TElement, TFilterTarget>> targetExpr, 
        IEnumerable<string> values
) {
    var lst = values.ToList();
    if (!lst.Any()) { return qry; }

    return qry.Where(
        Lambda<Expression<Func<TElement, bool>>>(
            Call(
                Constant(lst),
                containsMethod.MakeGenericMethod(typeof(T)),
                targetExpr.Body
            ),
            targetExpr.Parameters.ToArray()
        )
    );
}

可以这样称呼:

qry = qry
    .WhereValues(x => x.Size, sizeTerms)
    .WhereValues(x => x.Type, typeTerms);

一个警告:查询将基于传递给方法的值进行构建;如果以后进行更改,查询将不会反映这些更改。如果这是一个问题:

  • 获得的适当重载Enumerable.Contains,而不是List.Contains
  • 使用其重载Expression.Call会生成静态方法调用,而不是实例方法调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Scala中将多个case表达式链接在一起

来自分类Dev

MASM是否组装多个源文件并将它们链接在一起?

来自分类Dev

如何制作功能装饰器并将它们链接在一起?

来自分类Dev

如何在VB.NET或C#中使用具有两个不同值的xml从xml中填充下拉列表,同时使用定界符将它们连接在一起

来自分类Dev

如何在C#/。net中将XML数据链接在一起

来自分类Dev

在SAS中将where表达式与not in运算符一起使用

来自分类Dev

如何在 WHERE 子句上使用多个 OR?

来自分类Dev

如何加入字符串列表并删除重复的字母(将它们链接在一起)

来自分类Dev

将 UNION 和 WHERE 与多个表一起使用

来自分类Dev

使用XCTest,如何将{期望->等待}的多个离散序列链接在一起?

来自分类Dev

什么是Access _be和_bp文件,它们如何链接在一起?

来自分类Dev

使用多个 Where 语句

来自分类Dev

将多个计数与多个where子句一起使用

来自分类Dev

如何使用JPA CriteriaBuilder在WHERE中使用多个值

来自分类Dev

我创建了多个过滤器功能,每个功能都可以完成自己的工作,但是,我不确定如何将它们链接在一起,以便它们一起工作

来自分类Dev

如何编译多个C ++文件以将它们与Python ctypes一起使用?

来自分类Dev

如何一起使用WHERE和INNER JOIN

来自分类Dev

如何在Codeigniter中使用多个where子句?

来自分类Dev

熊猫:如何使用np.where匹配多个模式(OR)

来自分类Dev

如何使用多个WHERE子句进行删除[SQLITE]

来自分类Dev

如何在多个条件下使用np.where

来自分类Dev

如何正确使用多个SqlSelect set / add where函数

来自分类Dev

如何在Codeigniter中使用多个where子句?

来自分类Dev

熊猫:如何使用np.where匹配多个模式(OR)

来自分类Dev

如何使用多个WHERE函数指定搜索结果?

来自分类Dev

如何在Laravel Eloquent中使用多个where条件?

来自分类Dev

Laravel eloquent:接收多个ID时如何使用“where”?

来自分类Dev

如何使用where条件更新多个数据

来自分类Dev

如何使用 Zend Framework 2 创建多个 where->like()?

Related 相关文章

  1. 1

    如何在Scala中将多个case表达式链接在一起

  2. 2

    MASM是否组装多个源文件并将它们链接在一起?

  3. 3

    如何制作功能装饰器并将它们链接在一起?

  4. 4

    如何在VB.NET或C#中使用具有两个不同值的xml从xml中填充下拉列表,同时使用定界符将它们连接在一起

  5. 5

    如何在C#/。net中将XML数据链接在一起

  6. 6

    在SAS中将where表达式与not in运算符一起使用

  7. 7

    如何在 WHERE 子句上使用多个 OR?

  8. 8

    如何加入字符串列表并删除重复的字母(将它们链接在一起)

  9. 9

    将 UNION 和 WHERE 与多个表一起使用

  10. 10

    使用XCTest,如何将{期望->等待}的多个离散序列链接在一起?

  11. 11

    什么是Access _be和_bp文件,它们如何链接在一起?

  12. 12

    使用多个 Where 语句

  13. 13

    将多个计数与多个where子句一起使用

  14. 14

    如何使用JPA CriteriaBuilder在WHERE中使用多个值

  15. 15

    我创建了多个过滤器功能,每个功能都可以完成自己的工作,但是,我不确定如何将它们链接在一起,以便它们一起工作

  16. 16

    如何编译多个C ++文件以将它们与Python ctypes一起使用?

  17. 17

    如何一起使用WHERE和INNER JOIN

  18. 18

    如何在Codeigniter中使用多个where子句?

  19. 19

    熊猫:如何使用np.where匹配多个模式(OR)

  20. 20

    如何使用多个WHERE子句进行删除[SQLITE]

  21. 21

    如何在多个条件下使用np.where

  22. 22

    如何正确使用多个SqlSelect set / add where函数

  23. 23

    如何在Codeigniter中使用多个where子句?

  24. 24

    熊猫:如何使用np.where匹配多个模式(OR)

  25. 25

    如何使用多个WHERE函数指定搜索结果?

  26. 26

    如何在Laravel Eloquent中使用多个where条件?

  27. 27

    Laravel eloquent:接收多个ID时如何使用“where”?

  28. 28

    如何使用where条件更新多个数据

  29. 29

    如何使用 Zend Framework 2 创建多个 where->like()?

热门标签

归档