如何解决如何在C#上的表达式相等中使用MethodInfo和lifttonull
我正在尝试使用Expression.NotEqual()(here)
但是我不明白如何使用methodInfo。
我正试图与可能的布尔值进行比较?。
这是我要评估的属性,它在发布后添加到数据库中(创建null以及true和false:
public bool? Deactivated { get; set; } = false;
我正在使用具有通用性的工作表达式生成器,该生成器接受具有对象参数列表(如波纹管)的对象中发送的参数:
List<WhereParameters> whereList = new List<WhereParameters>();
whereList.Add(new WhereParameters
{
field = "ID",field_Value_Relation = "notEqual",value = Guid.Empty
});
whereList.Add(new WhereParameters
{
field = "Deactivated",field_Value_Relation = "notEqualorNull",//orNull => nullable
value = true
});
这些参数在构建器中使用:
public List<M> getExpression(QueryParameters<M> QueryParams)
{
//GET TYPE FROM GENERIC M
Type modelType = QueryParams.modelType;
//QUERY DB with GENERIC TYPE
IQueryable<M> queryableData = (IQueryable<M>)QueryParams.db.Set(modelType);
// Compose the expression tree that represents the parameter to the predicate.
//CREATE EXPRESSION PARAMETER
ParameterExpression pe = Expression.Parameter(typeof(M),"param");
// Create an expression tree that represents the expression
//if (QueryParams.whereParameters != null && QueryParams.whereParameters.Count > 0)
//{
int w = 0;
foreach (WhereParameters whereParam in QueryParams.whereParameters) {
//BLOCK A.1 WHERE
//Create Property on the Left of equality
Expression left1 = Expression.Property(pe,whereParam.field.ToLower());
//Create Property on the right of equality
Expression right1 = Expression.Constant(whereParam.value);
//Expresses the relation between left and right
//Expression e1;
switch (whereParam.field_Value_Relation)
{
case "notEqualOrNull":
predicateBody = Expression.NotEqual(left1,right1,true,????????);
break;
}
}
它抛出System.InvalidOperationException:未为类型'System.Nullable`1 [System.Boolean]'和'System.Boolean'定义二进制运算符NotEqual。
我不知道如何使用nullable来实现此目的。我理解了被提升的参数,但是无法理解要在Expression.NotEqual的最后一个参数中作为MethodInfo发送什么。有人可以给我看看如何做到这一点的例子吗?
谢谢大家
解决方法
遇到答案here
重构前的调试代码(保留所有内容,仅更改Switch,大小写):
case "notEqualOrNull":
//this block will be promoted out of here
var field = whereParam.field;
var fieldValue = whereParam.value;
var prop = modelType.GetProperty(field);
var isNullable = prop.PropertyType.IsNullableType();
var member = Expression.Property(pe,field);
var filter1 =
Expression.Constant(Convert.ChangeType(fieldValue,member.Type.GetGenericArguments()[0]));
Expression typeFilter = Expression.Convert(filter1,member.Type);
//this is a proxy of the code that will be here after refactoring
andPredicateBody = Expression.NotEqual(left1,typeFilter);
predicateBody = Expression.OrElse(predicateBody,andPredicateBody);
break;
一旦可以测试所有可为空的变量,将对其进行重构以便更通用。唯一的变化是var right1或typefilter。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。