2011-07-28 4 views
0

DateTimeプロパティの日付部分だけに基づいてエンティティを選択したい場合は、あまり頻繁には「パターン」を使用します。 EFは、T-SQLにDateTime.Dateプロパティを解析しませんので、私はこのコードを使用して終了:EF4のDateTimeプロパティでのみ日付を比較します。

var nextDay = raceDate.Date.AddDays(1); 
return EntityContext.RacingInfoes.SingleOrDefault(ri => ri.RaceDate >= raceDate && ri.RaceDate < nextDay); 

は、それは私がこれまでに発見した最も読みやすいソリューションですが、私はどこにでもそれを繰り返して好きではありません。しかし、私はそのメソッドがLinq to Entitiesパーサーによって認識されないので、どのメソッドでもカプセル化できません。私はこれについて何かできることはありますか?

答えて

1

あなたはこのようにメソッドを書くことで、それをカプセル化することができます:

Expression<Func<T, bool>> OnDate<T>(Expression<Func<T, DateTime>> selector, 
            DateTime date) 
{ 
    var nextDay = date.Date.AddDays(1); 
    // Build up an expression tree, using Expression.AndAlso etc to 
    // compare the result of applying the selector with both date and nextDay 
} 

次にあなたが書いたと思います:

return EntityContext.RacingInfoes.SingleOrDefault(Helper.OnDate(x => x.RaceDate), 
                raceDate); 

OnDateは悪い名前ですが、あなたは私が何を意味するか見.. )

0

私はこれを(多くの場合、LINQKitのInvoke機能と組み合わせて)使用します(これはJon Skeetの回答の実装に似ています):

public static class Criteria 
    { 
... 
     public static Expression<Func<DateTime, DateTime, bool>> IsOnDate = 
      (dateTime, onDate) => 
      dateTime >= onDate.Date `&&` dateTime < onDate.AddDays(1).Date; 
... 
    } 

このように、あなたは、単一の文

EntityContext.RacingInfoes.AsExpandable().SingleOrDefault(ri => 
    Criteria.IsOnDate.Invoke(ri.RaceDate, DateTime.Today) || someOtherCriteria); 
に他の条件との基準を組み合わせることができます