简体   繁体   English

使用 C# 中的 Lambda 表达式的多个条件

[英]Multiple condition using Lambda Expression in C#

The following code works for me if I need to filter a generic query for a single parameter, like Status=1.如果我需要为单个参数(例如 Status=1)过滤通用查询,则以下代码适用于我。

public static IQueryable<T> FilterBy<T>(this IQueryable<T> query)
        {
            var propertyName = "Status";
            var param_1 = "1";
            //var param_2 = 2;
            //var param_3 = "DE";

            var parameterExp = Expression.Parameter(typeof(T), "type");
            var propertyExp = Expression.Property(parameterExp, propertyName);

            var converter = TypeDescriptor.GetConverter(propertyExp.Type);
            var result = converter.ConvertFrom(param_1);
            var value = Expression.Constant(result);

            var equalBinaryExp = Expression.Equal(propertyExp, value);
            query = query.Where(Expression.Lambda<Func<T, bool>>(equalBinaryExp, parameterExp));

            return query;
        }

This is like filtering a list with a value.这就像过滤带有值的列表。

var list = new List<Employee> {
                new Employee { Id = 1, Name = "Phil", Status=1, Country="DE" } ,
                new Employee { Id = 2, Name = "Kristina", Status=2, Country="DE" },
                new Employee { Id = 3, Name = "Mia", Status=1, Country="US" }
            };

            list = list.Where(x => (x.Status == 1)).ToList();

But how should I modify the method FilterBy, so that it will work for filtering multiple values?但是我应该如何修改方法FilterBy,以便它可以过滤多个值? Like (Status=1 or Status=2) and Country="DE",像(Status=1 或 Status=2)和 Country="DE",

list = list.Where(x => (x.Status == 1 || x.Status == 2) && x.Country == "DE").ToList();

Thanks for your time.谢谢你的时间。

The trick when writing lambdas by hand is to write them how you would in regular C#, and decompile them, perhaps using sharplab like this .手工编写 lambda 表达式的技巧是按照常规 C# 的方式编写它们,然后反编译它们,可能使用像这样的 sharplab。 If you look on the right, you can see that it is doing something like:如果你看右边,你可以看到它正在做类似的事情:

Expression.AndAlso(
    Expression.OrElse(
        Expression.Equal(idPropExp, Expression.Constant(1)),
        Expression.Equal(idPropExp, Expression.Constant(2))
    ),
    Expression.Equal(countryPropExp, Expression.Constant("DE"))
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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