C# 使用创建表达式树!DateTime.HasValue
我有一个非常大的表达式树生成器,它已经构建并定期添加到需要的新功能中。它对所有类型(包括可为null的类型)都非常有效。我的几个可为null的类型是DateTime,因为数据库中的那些列允许为null 现在,我需要调整该方法,以便能够基于具有任何值的日期时间进行过滤。在SQL术语中:C# 使用创建表达式树!DateTime.HasValue,c#,.net,datetime,C#,.net,Datetime,我有一个非常大的表达式树生成器,它已经构建并定期添加到需要的新功能中。它对所有类型(包括可为null的类型)都非常有效。我的几个可为null的类型是DateTime,因为数据库中的那些列允许为null 现在,我需要调整该方法,以便能够基于具有任何值的日期时间进行过滤。在SQL术语中: WHERE date_Column IS NOT NULL 用LINQ术语来说: .Where(s => !s.date_column.HasValue) 就我而言,我不知道如何将其添加到我的表达式树中。
WHERE date_Column IS NOT NULL
用LINQ术语来说:
.Where(s => !s.date_column.HasValue)
就我而言,我不知道如何将其添加到我的表达式树中。我可以在MyFilter类中添加我喜欢的任何操作符,因此,如果一个新的情况会有所帮助,那就没有问题了
下面是为了可读性而缩减为DateTime部分的构建器
public class MyFilter
{
public string FieldName { get; set; }
public string FieldValue { get; set; }
public string Operator { get; set; }
}
private Expression<Func<MyDTO, bool>> CreateLambda(MyFilter myFilter)
{
ParameterExpression parameter = Expression.Parameter(typeof(MyDTO), "m");
Expression property = Expression.Property(parameter, myFilter.FieldName);
Expression target = null;
Expression exp = null;
PropertyInfo pi = null;
MethodInfo mi = null;
var switchType = property.Type.ToString();
switch (switchType)
{
case "System.DateTime":
target = (myFilter.FieldValue == "null") ?
Expression.Constant(null, property.Type) :
Expression.Constant(Convert.ToDateTime(myFilter.FieldValue));
switch (myFilter.Operator)
{
case "eq":
exp = Expression.Equal(property, Expression.Convert(target, property.Type));
break;
case "ne":
exp = Expression.NotEqual(property, Expression.Convert(target, property.Type));
break;
case "ge":
exp = Expression.GreaterThanOrEqual(property, Expression.Convert(target, property.Type));
break;
case "gt":
exp = Expression.GreaterThan(property, Expression.Convert(target, property.Type));
break;
case "le":
exp = Expression.LessThanOrEqual(property, Expression.Convert(target, property.Type));
break;
case "lt":
exp = Expression.LessThan(property, Expression.Convert(target, property.Type));
break;
}
break;
}
Expression<Func<MyDTO, bool>> lambda = Expression.Lambda<Func<MyDTO, bool>>(exp, parameter);
return lambda;
}
公共类MyFilter
{
公共字符串字段名{get;set;}
公共字符串字段值{get;set;}
公共字符串运算符{get;set;}
}
私有表达式CreateLambda(MyFilter MyFilter)
{
ParameterExpression参数=表达式参数(typeof(MyDTO),“m”);
Expression property=Expression.property(参数myFilter.FieldName);
表达式目标=null;
表达式exp=null;
PropertyInfo pi=null;
MethodInfo mi=null;
var switchType=property.Type.ToString();
开关(开关型)
{
案例“System.DateTime”:
目标=(myFilter.FieldValue==“null”)?
Expression.Constant(null,property.Type):
常量(Convert.ToDateTime(myFilter.FieldValue));
开关(myFilter.Operator)
{
案例“eq”:
exp=Expression.Equal(属性,表达式.Convert(目标,属性.Type));
打破
案例“ne”:
exp=Expression.NotEqual(属性、表达式、转换(目标、属性、类型));
打破
案例“ge”:
exp=Expression.GreaterThanOrEqual(属性,表达式.Convert(目标,属性.Type));
打破
案例“gt”:
exp=Expression.GreaterThan(property,Expression.Convert(target,property.Type));
打破
案例“le”:
exp=Expression.lessthanRequal(属性,表达式.Convert(目标,属性.Type));
打破
案例“lt”:
exp=Expression.LessThan(属性,表达式.Convert(目标,属性.Type));
打破
}
打破
}
表达式lambda=Expression.lambda(exp,参数);
返回lambda;
}
Filip Cordas是正确的,他的两个陈述产生了相同的正确结果。我不知道为什么Expression.NotEquals昨天对我不起作用,但是上面的代码确实起作用了
然而,由于我的问题是关于如何使用Nullable的HasValue属性,我非常欣赏Filip的第二个答案。而且,现在我看到了它,我自己无法得到它,这是一种谦卑
为在我的环境中使用HasValue而实现的代码如下所示:
public class MyFilter
{
public string FieldName { get; set; }
public string FieldValue { get; set; }
public string Operator { get; set; }
}
private Expression<Func<MyDTO, bool>> CreateLambda(MyFilter myFilter)
{
ParameterExpression parameter = Expression.Parameter(typeof(MyDTO), "m");
Expression property = Expression.Property(parameter, myFilter.FieldName);
Expression target = null;
Expression exp = null;
PropertyInfo pi = null;
MethodInfo mi = null;
var switchType = property.Type.ToString();
switch (switchType)
{
case "System.DateTime":
target = (myFilter.FieldValue == "null") ?
Expression.Constant(null, property.Type) :
Expression.Constant(Convert.ToDateTime(myFilter.FieldValue));
switch (myFilter.Operator)
{
case "eq":
exp = Expression.Equal(property, Expression.Convert(target, property.Type));
break;
case "ne":
if (myFilter.FieldValue == "null")
{
exp = Expression.Property(property, "HasValue");
}
else
{
exp = Expression.NotEqual(property, Expression.Convert(target, property.Type));
}
break;
case "ge":
exp = Expression.GreaterThanOrEqual(property, Expression.Convert(target, property.Type));
break;
case "gt":
exp = Expression.GreaterThan(property, Expression.Convert(target, property.Type));
break;
case "le":
exp = Expression.LessThanOrEqual(property, Expression.Convert(target, property.Type));
break;
case "lt":
exp = Expression.LessThan(property, Expression.Convert(target, property.Type));
break;
}
break;
}
Expression<Func<MyDTO, bool>> lambda = Expression.Lambda<Func<MyDTO, bool>>(exp, parameter);
return lambda;
}
公共类MyFilter
{
公共字符串字段名{get;set;}
公共字符串字段值{get;set;}
公共字符串运算符{get;set;}
}
私有表达式CreateLambda(MyFilter MyFilter)
{
ParameterExpression参数=表达式参数(typeof(MyDTO),“m”);
Expression property=Expression.property(参数myFilter.FieldName);
表达式目标=null;
表达式exp=null;
PropertyInfo pi=null;
MethodInfo mi=null;
var switchType=property.Type.ToString();
开关(开关型)
{
案例“System.DateTime”:
目标=(myFilter.FieldValue==“null”)?
Expression.Constant(null,property.Type):
常量(Convert.ToDateTime(myFilter.FieldValue));
开关(myFilter.Operator)
{
案例“eq”:
exp=Expression.Equal(属性,表达式.Convert(目标,属性.Type));
打破
案例“ne”:
如果(myFilter.FieldValue==“null”)
{
exp=Expression.Property(Property,“HasValue”);
}
其他的
{
exp=Expression.NotEqual(属性、表达式、转换(目标、属性、类型));
}
打破
案例“ge”:
exp=Expression.GreaterThanOrEqual(属性,表达式.Convert(目标,属性.Type));
打破
案例“gt”:
exp=Expression.GreaterThan(property,Expression.Convert(target,property.Type));
打破
案例“le”:
exp=Expression.lessthanRequal(属性,表达式.Convert(目标,属性.Type));
打破
案例“lt”:
exp=Expression.LessThan(属性,表达式.Convert(目标,属性.Type));
打破
}
打破
}
表达式lambda=Expression.lambda(exp,参数);
返回lambda;
}
您试图将null
转换为DateTime
而不是DateTime?
。对于所有?
类型,名称均为Nullable1您是否使用EF作为可查询权限?您的属性应该是DateTime?
我想我们需要更多帮助或类型来理解。参数
来自何处?什么是属性
?为什么myFilter.FieldValue
==“null”和myFilter.Operator
不能“ne”工作?@FilipCordas C中的所有对象都接受null作为可能的值DateTime
也不例外。@NetMage DateTime是一个结构,也是一个不可为空的值类型。默认值是new Date(