请注意:我知道如何解决这个问题。我不是在寻找解决方案,而是在寻找问题本身的清晰度。
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 中的函数。当我将其更改为不存在歧义的自定义函数时会怎样。
IE:
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 对象。