Linq Expression Builder datetime.year比较

时间:2014-10-14 15:39:36

标签: linq entity-framework expression-trees dynamic-linq

目前我正在使用表达式构建器进行动态查询生成。

我为int,date time和string运算符创建了动态表达式。现在我陷入了困境。

我想通过表达式比较datetime的月份部分。

我们正在传递datetime的属性,并希望为该属性的月份创建表达式。

代码:

public static Expression GetDynamicquery<TSource>(
        string property, object value, ParameterExpression p)
    {

        var propertyReference = Expression.Property(p, property);


        var constantReference = Expression.Constant(value);
        var expression = Expression.Equal(propertyReference, constantReference);
        MethodInfo method = null;



                return Expression.LessThanOrEqual(propertyReference, constantReference);



    }

这里的属性是我传递给Tsource的属性名称。

p是Tsource类型的参数表达式。

我想要像本月所有生日那样的结果。

2 个答案:

答案 0 :(得分:0)

你可以使用 Expression.PropertyOrField方法。 但不确定它是否适用于实体框架查询。

http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.propertyorfield(v=vs.110).aspx

更新

对于实体框架,您可以使用SqlFunctions.DatePart方法。

http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions(v=vs.110).aspx

你需要一个Expression.Call来表示它作为一个表达式。

http://msdn.microsoft.com/en-us/library/bb349020(v=vs.110).aspx

答案 1 :(得分:0)

我得到了回答我的问题。我做的就像....

代码:

public static Expression GetDynamicquery<TSource>(
    string property, object value, ParameterExpression p)
{

    var propertyReference = Expression.Property(p, property);

    propertyReference = Expression.Property(propertyReference, "Year");

    var constantReference = Expression.Constant(value);
    return Expression.Equal(propertyReference, constantReference);
}

这里的第一个属性引用将给出日期时间表达式。

再次使用该表达式,我们可以向内一步并访问年份属性。 我们一个月可以做同样的事情。