我正在做一个有几个不同选项的搜索表单,除了这一部分之外全部工作。
作为参考,我发布了整个方法,但我遇到的问题是尝试使用动态表达来检查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);
}
答案 0 :(得分:1)
如果UltrasonicTest
是bool?
,则必须确定如果值为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?)));