检查一下bool?动态Lambda中为True

时间:2015-05-10 20:49:37

标签: c# linq lambda

我正在做一个有几个不同选项的搜索表单,除了这一部分之外全部工作。

作为参考,我发布了整个方法,但我遇到的问题是尝试使用动态表达来检查bool?属性。

这行代码是我遇到问题的地方......

call = Expression.IsTrue(propertyAccess); //TODO: Check if the property is true

正如所写,它抱怨bool转换为bool?。如果我将其更改为bool而不是bool?,则会抱怨IsTrue is not a valid Linq expression

基本上我想做x => x.UltrasonicTest == true但不知道如何将其设置为MethodCallExpression

这是代码的简短版本......

public ActionResult Search(List<string> selectedTests)
    {
        IQueryable<Logbook> logbooks;
        Expression lambdaStatus = null;
        Expression lambdaTests = null;
        Expression lambdaFinal = null;

        ParameterExpression parameter = Expression.Parameter(typeof(Logbook), "logbook");
        Expression call = null;
        PropertyInfo property = null;

        property = typeof(Logbook).GetProperty("UltrasonicTest");

        if (property != null)
        {
            MemberExpression propertyAccess = Expression.MakeMemberAccess(parameter, property);
            call = Expression.IsTrue(propertyAccess); //TODO: Check if the property is true

            lambdaTests = call;
        }

        lambdaFinal = Expression.And(lambdaStatus, lambdaTests);

        Expression<Func<Logbook, bool>> predicate = Expression.Lambda<Func<Logbook, bool>>(lambdaFinal, parameter);
        logbooks = db.Logbooks.Where(predicate);

        List<Logbook> filteredLogbooks = logbooks.OrderByDescending(x => x.DateEntered.Value).Take(50).ToList();

        return View("Index", filteredLogbooks);
    }

2 个答案:

答案 0 :(得分:1)

如果UltrasonicTestbool?,则必须确定如果值为null则返回什么值。如果您只是希望lambda返回该属性是否为null 为true,则可以创建以下表达式:

x => x.UltrasonicTest.GetValueOrDefault()

假设我想从头开始创建这个表达式,请按以下步骤创建:

var param = new ParameterExpression(typeof(Logbook), "x");
var prop = Expression.PropertyOrField(param, "UltraSonicTest");
var valOrDefault = Expression.Call(prop, "GetValueOrDefault", null);

var lambda = Expression.Lambda<Func<LogBook, bool>>(valOrDefault, param);

答案 1 :(得分:1)

而不是尝试创建MethodCallExpression尝试使用BinaryExpression Constant构建true

这样的事情:

call = Expression.MakeBinary(ExpressionType.Equal, propertyAccess, Expression.Constant(true, typeof(bool?)));

修改

或更整洁的选择:

call = Expression.Equal(propertyAccess, Expression.Constant(true, typeof(bool?)));