2012-04-27 6 views
3

私はPredicateBuilderを使用して動的検索句を生成しています。下のサンプルコードでは、を変更できるので、のDateTimeプロパティに使用できますか?PredicateBuilder再利用可能なDateTime述語セッター

Expression<Func<SomeType, bool>> somePredicate = null; 
somePredicate = somePredicate.Or(
    SetDateTimePredicate(comparisonOperator, dateTime1, dateTime2)); 

private Expression<Func<SomeType, bool>> SetDateTimePredicate(
    Enums.ComparisonOperator comparison, 
    DateTime dateTime1, 
    DateTime dateTime2) 
{ 
    switch (comparison) 
    { 
     case Enums.ComparisonOperator.IsLessThan: 
      return p => p.SomeDateProperty < dateTime1; 
     case Enums.ComparisonOperator.IsLessThanOrEqualTo: 
      return p => p.SomeDateProperty <= dateTime1; 
     case Enums.ComparisonOperator.IsGreaterThan: 
      return p => p.SomeDateProperty > dateTime1; 
     case Enums.ComparisonOperator.IsGreaterThanOrEqualTo: 
      return p => p.SomeDateProperty >= dateTime1; 
     case Enums.ComparisonOperator.IsBetween: 
      return p => p.SomeDateProperty >= dateTime1 
        && p.SomeDateProperty <= dateTime2; 
     default: 
      return p => p.SomeDateProperty == dateTime1; 
    } 
} 

私は、拡張メソッドを試してみましたが、このエラーを取得:

System.NotSupportedException occurred 
Message="Method 'Boolean Compare(System.DateTime, ComparisonOperator, System.DateTime, System.DateTime)' has no supported translation to SQL."  

拡張方法:拡張メソッドを持つ

public static bool Compare(
    this DateTime dateToCompare, 
    Enums.ComparisonOperator comparison, 
    DateTime dateTime1, 
    DateTime dateTime2) 
{ 
    switch (comparison) 
    { 
     case Enums.ComparisonOperator.IsLessThan: 
      return dateToCompare < dateTime1; 
     case Enums.ComparisonOperator.IsLessThanOrEqualTo: 
      return dateToCompare <= dateTime1; 
     case Enums.ComparisonOperator.IsGreaterThan: 
      return dateToCompare > dateTime1; 
     case Enums.ComparisonOperator.IsGreaterThanOrEqualTo: 
      return dateToCompare >= dateTime1; 
     case Enums.ComparisonOperator.IsBetween: 
      return dateToCompare >= dateTime1 
       && dateToCompare <= dateTime2; 
     default: 
      return dateToCompare == dateTime1; 
    } 
} 

はサンプル:以下

somePredicate = somePredicate.Or(
    p => p.SomeDateProperty.Compare(comparisonOperator, dateTime1, dateTime2)); 
+0

L2SまたはEFの場合はそれですか? –

+0

Linq-to-SQL(ありがとう) – user1360192

+0

私は最初のメソッドをテストし、それが機能しました。より多くの文脈を投稿できますか? –

答えて

1

は一般的なもので解決策、それはfまたは比較演算子がDateTimeだけでなく定義されているすべての型のいずれかです。 Enum.ComparisionOperator型でメソッド、拡張メソッドを作成しました。以下のように定義

Expression<Func<SomeType, bool>> somePredicate = comparisonOperator.Compare(
    (SomeType p) => p.SomeDateProperty, dateTime1, dateTime2)); 

方法:

public static Expression<Func<TSource, bool>> Compare<TSource, TValue>(
    this Enums.ComparisonOperator comparison, 
    Expression<Func<TSource, TValue>> source, 
    TValue value1, TValue value2) 
{ 
    var value1Expr = Expression.Constant(value1); 
    var value2Expr = Expression.Constant(value2); 
    var newExpr = comparison.CompareExpr(source.Body, value1Expr, value2Expr); 
    return Expression.Lambda<Func<TSource, bool>>(newExpr, source.Parameters); 
} 
public static Expression CompareExpr(
    this Enums.ComparisonOperator comparison, 
    Expression exprLeft, 
    Expression exprRight1, Expression exprRight2) 
{ 
    switch (comparison) 
    { 
     case Enums.ComparisonOperator.IsLessThan: 
      return Expression.LessThan(exprLeft, exprRight1); 
     case Enums.ComparisonOperator.IsLessThanOrEqualTo: 
      return Expression.LessThanOrEqual(exprLeft, exprRight1); 
     case Enums.ComparisonOperator.IsGreaterThan: 
      return Expression.GreaterThan(exprLeft, exprRight1); 
     case Enums.ComparisonOperator.IsGreaterThanOrEqualTo: 
      return Expression.GreaterThanOrEqual(exprLeft, exprRight1); 
     case Enums.ComparisonOperator.IsBetween: 
      return Expression.AndAlso(
       Expression.GreaterThanOrEqual(exprLeft, exprRight1), 
       Expression.LessThanOrEqual(exprLeft, exprRight2)); 
     default: 
      return Expression.Equal(exprLeft, exprRight1); 
    } 
} 

編集:次のように使用されるだろう、私は一般的なように、上記の方法を変更しました。

関連する問題