2009-02-20 12 views
55

エンティティフレームワークでLINQを使用して2つの日付の間の日数を決定しようとしています。 System.TimeSpanクラスのSubtractを認識しないことを伝えています2つの日付を減算するエンティティへのLINQ

ここは私のLINQクエリの場所です。ここ

where ((DateTime.Now.Subtract(vid.CreatedDate).TotalDays < maxAgeInDays)) 

私はVS.NETデバッガ

{ "LINQはエンティティに方法を認識しない 'のSystem.TimeSpan減算(可能System.DateTime)' メソッド、およびこの中に受信エラーでありますメソッドをストア式に変換できません。」}

何か間違っているか、エンティティフレームワークの2つのDateTimesの間の日数を取得する良い方法がありますか?

おかげ マイケル

+0

私はまた、ビット以下に式を変更することにより、タイムスパンを避けるためにしようとした - –

答えて

41

です魅力的に働いた - 私に表現木について考えさせてくれたMicahに感謝する

+2

あなたは答えとして@Micahのフラグを立てて、彼の応答にコメントを追加するか、質問を最終的な回答で更新する必要があります。 – ongle

+0

賢い、賢い賢い。シンプルでストレートです。なぜ私は最初にそれが私に来なかったのだろうと思っています。お返事ありがとうございました –

11

述語は式ツリーに変換する必要があるためあなたはissesのこれらの種類に実行します。そして、翻訳プロセスはDateTime.Now.Subtractメソッドを認識しません。私は

DateTime oldestDate = DateTime.Now.Subtract(new TimeSpan(maxAgeInDays, 0, 0, 0, 0)); 
... 

が、私はLINQクエリ

where (vid.CreatedDate >= oldestDate) 

のどこの部分を修正最古の日付を表す日付時刻変数を定義し

動作するようにそれを得た方法ここで

+0

まだ 場所(vid.CreatedDate.AddDays(maxAgeInDays)> = DateTime.Now)が動作しない何を行うにはとにかくがあります私は表現木に翻訳できるようにしようとしていますか? –

1

実際には、LINQ to Entitiesはクエリ全体をSQL文に変換する必要があります。これはSubtractメソッドを認識できない場所です。これは、クエリ内でC#/ VBメソッドを使用しようとするたびに発生します。このような場合、クエリからその部分を引き出す方法を見つけなければなりません。 http://mosesofegypt.net/post/LINQ-to-Entities-what-is-not-supported.aspx

+0

この回答は正しいですが、私が欲しかった答えは間違いありません。 LINQ to SQLは、好きなだけ多くのメソッドを呼び出すことができました。このトレードオフは残念です。 –

+2

リンクが無効です。 – Bijan

90

受け入れ答えは、この場合は良いですが、参考のために、あなたは他のものの間で、日付の操作を実行するためにEntityFunctionsクラスを使用することができます。 この投稿は、もう少し説明しています。

where (vid.CreatedDate >= EntityFunctions.AddDays(DateTime.Now, -maxAgeInDay)) 
+0

ありがとう、これは私が探していたものです。 – wdanda

+3

これは、Entity Framework v4でのみサポートされていることに注意してください。これはEntity Framework v1では機能しません。 –

+0

EntityFunctionsクラスを共有してくれてありがとう。非常に便利な – StackThis

18

またSystem.Data.Objects.EntityFucntionsを使用することができます。

currentDate = DateTime.Now; 

... 
where EntityFunctions.DiffDays(currentDate, vid.CreatedDate) < maxAgeIdDays 

EntityFunctionsからのすべての機能だけでLINQのツーエンティティのためのものであり、SQL関数にマップされます。あなたのモデルに新しいプロパティを定義することができ

+0

これらはLinq to Entitiesでも機能します。 –

+0

@Morten:これはタイプで、Linqとエンティティのみで動作します。 –

+0

多くのSQL Server固有の関数は、 'System.Data.Objects.SqlClient.SqlFunctions'クラスを通して利用できます。もちろん、このためにはデータストアがSQL Serverでなければなりません。詳細情報:http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.aspx – bernhof

0

:あなたは結果を見て持っている場合、あなたのようなリターンを使用することができ

var query = from temp in db.Table 
select new MyModel { 
    Id = temp.Id, 
    Variable1 = temp.Variable1, 
    ... 
    EndDate = temp.EndDate, 
    StartDate = temp.StartDate 
} 

public DateTime StartDate{ get; set; } 
    public DateTime EndDate{ get; set; } 
    public TimeSpan CalculateTime{ 
     get 
     { 
      return EndDate.Subtract(StartDate); 
     } 
    } 

、あなたはそのようなものを使用することができます

return query 

ここで、クエリでは、CalculateTime(EndDateとStartdateの減算)があります。

関連する問題