实体框架:通过Expression比较日期

时间:2014-12-12 23:43:03

标签: c# entity-framework expression

我正在使用表达式和LinqKit PredicateBuilder构建表达式树来搜索数据。 我在尝试仅在日期字段上比较日期时遇到问题。

无法使用.Date字段,因为实体框架不支持它。在我首先构建Expression时,我无法使用DbFunctions.TruncateTime函数。

有谁知道在这种情况下我能做些什么?

一些代码:

    /// <summary>
    /// Builds a conditional Expression based upon the comparison type passed
    /// </summary>
    /// <typeparam name="T">The class the conditional expression is for</typeparam>
    /// <typeparam name="DataType">The type of data to be compared upon</typeparam>
    /// <param name="selector">Expression to retrieve the Field to compare on</param>
    /// <param name="value">The value to compare to</param>
    /// <param name="comparison">The comparison type to use</param>
    /// <param name="expressions">Any additional expression to add (using AND) to this one)</param>
    /// <returns>The expression requested</returns>
    private Expression<Func<T, bool>> BuildCondition<T, DataType>(Expression<Func<T, DataType>> selector, DataType value, Comparison comparison, params Expression<Func<T, bool>>[] expressions)
    {            
        Expression<Func<T, bool>> result = null;
        switch (comparison)
        {
            case Comparison.Equals:
            default:
                result = Expression.Lambda<Func<T, bool>>(Expression.Equal(selector.Body, Expression.Constant(value)), selector.Parameters);
                break;
            case Comparison.NotEquals:
                result = Expression.Lambda<Func<T, bool>>(Expression.NotEqual(selector.Body, Expression.Constant(value)), selector.Parameters);
                break;
            case Comparison.SmallerThan:
                result = Expression.Lambda<Func<T, bool>>(Expression.LessThan(selector.Body, Expression.Constant(value)), selector.Parameters);
                break;
            case Comparison.SmallerOrEquals:
                result = Expression.Lambda<Func<T, bool>>(Expression.LessThanOrEqual(selector.Body, Expression.Constant(value)), selector.Parameters);
                break;
            case Comparison.GreaterThan:
                result = Expression.Lambda<Func<T, bool>>(Expression.GreaterThan(selector.Body, Expression.Constant(value)), selector.Parameters);
                break;
            case Comparison.GreaterOrEquals:
                result = Expression.Lambda<Func<T, bool>>(Expression.GreaterThanOrEqual(selector.Body, Expression.Constant(value)), selector.Parameters);
                break;
        }

        if (expressions != null)
        {
            foreach (var exp in expressions) result = result.And(exp);
        }

        return result.Expand();
    }

用法

var pr = PredicateBuilder.False<QuestionnaireUserResponseGroup>();
pr = pr.And(BuildCondition<QuestionnaireUserResponseGroup, string>((r => r.DateTimeCompleted), searchCondition.Value, searchCondition.Comparison));

提前感谢您的帮助。

0 个答案:

没有答案