66

我正在尝试使用带有实体框架的 LINQ 确定两个日期之间的天数。它告诉我它无法识别 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 之间的天数?

谢谢迈克尔

4

6 回答 6

100

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

where (vid.CreatedDate >= EntityFunctions.AddDays(DateTime.Now, -maxAgeInDay))
于 2011-05-12T07:02:45.303 回答
48

这是我如何让它工作的

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

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

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

where (vid.CreatedDate >= oldestDate )

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

于 2009-02-20T19:54:28.313 回答
22

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

currentDate = DateTime.Now;

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

from 的所有函数EntityFunctions仅适用于 Linq-to-entities 并映射到 SQL 函数。

于 2011-05-12T07:30:57.337 回答
11

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

于 2009-02-20T19:35:26.923 回答
1

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

于 2010-04-04T04:48:06.370 回答
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 ,例如:

return query

现在,在查询中,我们有计算时间(EndDate 和 Startdate 之间的减法)。

于 2016-12-12T15:47:42.607 回答