我正在使用表达式和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));
提前感谢您的帮助。