如何将多个MethodCallExpressions合并为一个表达式?

Qerts

我有一个查询,我需要对其应用n个过滤器。但是我必须使用表达式。到目前为止,我已经为每个过滤器构造了表达式,效果很好。问题是我想将这些过滤器合并为一个表达式,以便可以将其用作LINQ的.Where()的参数。

过滤器代码:

    //Filters could slightly differ in functionality 
    private Expression<Func<T, bool>> StringPropertyContains<T>(Filter filter)
    {
        if (filter == null)
        {
            throw new ArgumentNullException(nameof(filter));
        }

        if (typeof(T).GetProperties().FirstOrDefault(pi => pi.Name.Equals(filter.PropertyName, StringComparison.OrdinalIgnoreCase)) == null)
        {
            throw new ArgumentNullException($"Type {typeof(T)} does not contain property {filter.PropertyName}");
        }

        var propertyInfo = typeof(T).GetProperty(filter.PropertyName);
        var param = Expression.Parameter(typeof(T));
        var member = Expression.MakeMemberAccess(param, propertyInfo);
        var constant = Expression.Constant(filter.Value, typeof(filter.Type));
        var methodInfo = typeof(filter.Type).GetMethod(filter.Method, new Type[] { typeof(filter.Type) });
        var body = Expression.Call(member, methodInfo, constant);

        return Expression.Lambda<Func<T, bool>>(body, param);
    }

    private Expression<Func<T, bool>> Filter<T>(T t)
    {
        //TODO join filters while each filter should have its different parameter
        //the parameter is currently constructed in the object and is accessible via property Filter[] ParsedFilter
    }

过滤器类别:

internal class Filter
{
    public string Type { get; }
    public string Method { get; }
    public string PropertyName { get; }
    public string Value { get; }
}

所需用法:

IQueryable<T> q = query.Where(this.Filter)

老实说,我对此问题感到非常头疼,因为我对表达式还很陌生。因此,感谢您的任何帮助。

阿什坎·莫巴宁·贾巴尼

您不能将类作为参数传递给Where子句,但是可以使用Linq Expressions来实现所需的功能:

Expression<Func<T, bool>> filter = q => q.type == filter.Type && q.Value == filter.Value;

var x = query.Where(filter);

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将两个 xpath 表达式合并为一个?

来自分类Dev

如何将这两个正则表达式合并为一个?

来自分类Dev

使用正则表达式将多个标签合并为一个标签

来自分类Dev

一个接一个地执行多个正则表达式或将多个正则表达式合并为一个

来自分类Dev

如何在SQLAlchemy中将多个正则表达式合并为一个?

来自分类Dev

如何将多个目录合并为一个

来自分类Dev

如何将多个目录合并为一个

来自分类Dev

否定多个正则表达式并将其合并为一个

来自分类Dev

将两个正则表达式合并为一个正则表达式

来自分类Dev

试图将两个单独的正则表达式合并为一个

来自分类Dev

将三个正则表达式合并为一个(或两个)

来自分类Dev

如何将两个或多个Counters合并为一个字典?

来自分类Dev

如何将多个topojson文件合并为一个topojson文件

来自分类Dev

如何将多个PNG图像合并为一个XCF图像中的图层?

来自分类Dev

如何将多个HTML文件合并为一个主HTML文件

来自分类常见问题

如何将多个g表中的数据合并为一个?

来自分类Dev

如何将多个返回的列表合并为一个

来自分类Dev

如何将多个QHash合并为一个QHash

来自分类Dev

使用GNU Make,如何将多个文件合并为一个?

来自分类Dev

如何将多个布尔比较合并为一个

来自分类Dev

如何将多个TIF文件合并为一个TIF文件?

来自分类Dev

如何将多个SQL查询合并为一个

来自分类Dev

如何将多个Internet连接合并为一个?

来自分类Dev

如何将多个CouchDB查询合并为一个请求?

来自分类Dev

如何将多个plist文件合并为一个?

来自分类Dev

Laravel-如何将多个查询合并为一个口才查询

来自分类Dev

如何将多个表合并为一个表,以使列名成为行名?

来自分类Dev

如何将多个Internet连接合并为一个?

来自分类Dev

如何将多个TIF文件合并为一个TIF文件?

Related 相关文章

  1. 1

    如何将两个 xpath 表达式合并为一个?

  2. 2

    如何将这两个正则表达式合并为一个?

  3. 3

    使用正则表达式将多个标签合并为一个标签

  4. 4

    一个接一个地执行多个正则表达式或将多个正则表达式合并为一个

  5. 5

    如何在SQLAlchemy中将多个正则表达式合并为一个?

  6. 6

    如何将多个目录合并为一个

  7. 7

    如何将多个目录合并为一个

  8. 8

    否定多个正则表达式并将其合并为一个

  9. 9

    将两个正则表达式合并为一个正则表达式

  10. 10

    试图将两个单独的正则表达式合并为一个

  11. 11

    将三个正则表达式合并为一个(或两个)

  12. 12

    如何将两个或多个Counters合并为一个字典?

  13. 13

    如何将多个topojson文件合并为一个topojson文件

  14. 14

    如何将多个PNG图像合并为一个XCF图像中的图层?

  15. 15

    如何将多个HTML文件合并为一个主HTML文件

  16. 16

    如何将多个g表中的数据合并为一个?

  17. 17

    如何将多个返回的列表合并为一个

  18. 18

    如何将多个QHash合并为一个QHash

  19. 19

    使用GNU Make,如何将多个文件合并为一个?

  20. 20

    如何将多个布尔比较合并为一个

  21. 21

    如何将多个TIF文件合并为一个TIF文件?

  22. 22

    如何将多个SQL查询合并为一个

  23. 23

    如何将多个Internet连接合并为一个?

  24. 24

    如何将多个CouchDB查询合并为一个请求?

  25. 25

    如何将多个plist文件合并为一个?

  26. 26

    Laravel-如何将多个查询合并为一个口才查询

  27. 27

    如何将多个表合并为一个表,以使列名成为行名?

  28. 28

    如何将多个Internet连接合并为一个?

  29. 29

    如何将多个TIF文件合并为一个TIF文件?

热门标签

归档