web-dev-qa-db-ja.com

2つの日付を減算するためのLINQ to Entities

LINQとEntity Frameworkを使用して、2つの日付間の日数を決定しようとしています。 System.TimeSpanクラスのSubtractを認識しないことを教えてくれます

ここに、LINQクエリのwhere部分があります。

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

VS.NETデバッガーで受け取るエラーは次のとおりです。

{「LINQ to Entitiesはメソッド 'System.TimeSpan Subtract(System.DateTime)'メソッドを認識せず、このメソッドはストア式に変換できません。」}

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

マイケルに感謝

58
Michael I

これが私がどのように機能するようになったかです

最も古い日付を表す日時変数を定義しました

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

次に、LINQクエリのwhere部分を変更しました

where (vid.CreatedDate >= oldestDate )

魔法のように働いた-表現ツリーについて考えさせてくれたミカに感謝

42
Michael I

この場合、受け入れられた答えの方が優れていますが、参照用に EntityFunctions クラスを使用して、特に日付の操作を実行できます。

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

System.Data.Objects.EntityFucntionsを使用することもできます:

currentDate = DateTime.Now;

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

EntityFunctionsのすべての関数は、Linq-to-entities専用であり、SQL関数にマップされます。

19
Ladislav Mrnka

述語を式ツリーに変換する必要があるため、この種の問題が発生します。また、翻訳プロセスはDateTime.Now.Subtractメソッドを認識しません。

11
Micah

事実、LINQ to Entitiesでは、クエリ全体をSQLステートメントに変換する必要があります。 Subtractメソッドを認識できない場所です。クエリ内でC#/ VBメソッドを使用しようとするたびに発生します。これらの場合、クエリからその部分を引き出す方法を理解する必要があります。この投稿ではもう少し説明します: http://mosesofegypt.net/post/LINQ-to-Entities-what-is-not-supported.aspx

1
Mahmoodvcs

モデルに新しいプロパティを定義できます:

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

これで、次のようなものを使用できます。

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

結果を確認したら、次のようなreturnを使用できます。

return query

さて、クエリには、CalculateTime(EndDateとStartdateの間の減算)があります。

0
oknevermind