Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用创建表达式树!DateTime.HasValue_C#_.net_Datetime - Fatal编程技术网

C# 使用创建表达式树!DateTime.HasValue

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) 就我而言,我不知道如何将其添加到我的表达式树中。

我有一个非常大的表达式树生成器,它已经构建并定期添加到需要的新功能中。它对所有类型(包括可为null的类型)都非常有效。我的几个可为null的类型是DateTime,因为数据库中的那些列允许为null

现在,我需要调整该方法,以便能够基于具有任何值的日期时间进行过滤。在SQL术语中:

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(