注意してください:私はこれを回避する方法を知っています。私は解決策を探しているのではなく、問題自体の明確さを求めています。
class Program
{
static void Main(string[] args)
{
using (var context = new TestDbContext())
{
var eventsFound = context.Events
.Where(e =>
e.EventDate >= DateTime.Now.AddDays(-1) &&
e.EventDate <= DateTime.Now.AddDays(+1)
)
.ToList();
}
}
}
public class TestDbContext : DbContext
{
public DbSet<Event> Events { get; set; }
}
public class Event
{
public int EventId { get; set; }
public DateTime EventDate { get; set; }
}
わかりましたので、上記のプログラムは次のエラーで失敗します。
LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)'
method, and this method cannot be translated into a store expression.
LINQ がデータベース関数とオブジェクト関数の違いを認識できないのはなぜですか。システムは、AddDays 関数が DateTime オブジェクトの一部であることを認識できるほど賢くある必要があります。次に、まずその関数を解決し、クエリ内のすべての関数が解決されたら、SQL に変換してデータベースに対して実行します。
それよりもはるかに複雑だと確信していますが、その理由を理解したいと思います。
=========編集==============
したがって、「AddDays」は .NET と SQL の両方に存在する関数であるため、上記は実際には良い例ではありませんでした。あいまいさが存在しない自己定義関数に変更するとどうなりますか。
すなわち:
public class Event
{
public int EventId { get; set; }
public DateTime EventDate { get; set; }
public DateTime ReturnDateNowExample()
{
return DateTime.Now;
}
}
static void Main(string[] args)
{
var myEvent = new Event {EventDate = new DateTime(2013, 08, 28)};
using (var context = new TestDbContext())
{
var eventsFound = context.Events
.Where(e =>
e.EventDate >= myEvent.ReturnDateNowExample()
)
.ToList();
}
}
あいまいな DateTime オブジェクトの場合は、string/int オブジェクトに置き換えます。