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間の日数を取得するより良い方法がありますか?
マイケルに感謝
これが私がどのように機能するようになったかです
最も古い日付を表す日時変数を定義しました
DateTime oldestDate = DateTime.Now.Subtract(new TimeSpan(maxAgeInDays, 0, 0, 0, 0));
...
次に、LINQクエリのwhere部分を変更しました
where (vid.CreatedDate >= oldestDate )
魔法のように働いた-表現ツリーについて考えさせてくれたミカに感謝
この場合、受け入れられた答えの方が優れていますが、参照用に EntityFunctions
クラスを使用して、特に日付の操作を実行できます。
where (vid.CreatedDate >= EntityFunctions.AddDays(DateTime.Now, -maxAgeInDay))
System.Data.Objects.EntityFucntions
を使用することもできます:
currentDate = DateTime.Now;
...
where EntityFunctions.DiffDays(currentDate, vid.CreatedDate) < maxAgeIdDays
EntityFunctions
のすべての関数は、Linq-to-entities専用であり、SQL関数にマップされます。
述語を式ツリーに変換する必要があるため、この種の問題が発生します。また、翻訳プロセスはDateTime.Now.Subtractメソッドを認識しません。
事実、LINQ to Entitiesでは、クエリ全体をSQLステートメントに変換する必要があります。 Subtractメソッドを認識できない場所です。クエリ内でC#/ VBメソッドを使用しようとするたびに発生します。これらの場合、クエリからその部分を引き出す方法を理解する必要があります。この投稿ではもう少し説明します: http://mosesofegypt.net/post/LINQ-to-Entities-what-is-not-supported.aspx
モデルに新しいプロパティを定義できます:
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の間の減算)があります。