LINQ to Entities用于减去2个日期

时间:2009-02-20 19:13:16

标签: entity-framework datetime linq-to-entities

我正在尝试使用LINQ和Entity Framework确定两个日期之间的天数。它告诉我它不能识别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之间的天数?

感谢 迈克尔

6 个答案:

答案 0 :(得分:95)

在这种情况下,接受的答案更好,但作为参考,您可以使用EntityFunctions类来执行日期操作等。

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

答案 1 :(得分:42)

以下是我如何使用它

我定义了一个代表最早日期的日期时间变量

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

然后我修改了LINQ查询的where部分

where (vid.CreatedDate >= oldestDate )

像魅力一样工作 - 感谢Micah让我思考表达树

答案 2 :(得分:19)

您还可以使用System.Data.Objects.EntityFucntions

currentDate = DateTime.Now;

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

EntityFunctions中的所有函数仅适用于Linq到实体,并映射到SQL函数。

答案 3 :(得分:11)

您遇到这类问题,因为谓词需要转换为表达式树。并且翻译过程无法识别DateTime.Now.Subtract方法。

答案 4 :(得分:1)

事实是,通过设计,LINQ to Entities需要将整个查询转换为SQL语句。这是它无法识别Subtract方法的地方。每当您尝试在查询中使用C#/ VB方法时,都会发生这种情况。在这些情况下,您必须找出从查询中提取该部分的方法。 这篇文章解释了一下: http://mosesofegypt.net/post/LINQ-to-Entities-what-is-not-supported.aspx

答案 5 :(得分:0)

您可以在模型中定义新属性:

    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 query

现在,在查询中,我们有CalculateTime(在EndDate和Startdate之间减去)。