【发布时间】:2016-10-06 20:30:23
【问题描述】:
我正在尝试在进行 sql 分组之前找到一种将 UTC 时间移动到本地的方法。我正在使用 System.Linq.Dynamic (在此处管理 https://github.com/kahanu/System.Linq.Dynamic )。它非常适合在编译时没有必填字段的情况下进行动态选择。在我们的例子中,我们以 UTC 格式存储所有日期时间。在这种动态选择中,可能有人想对小时、年、月等进行分组。在这种情况下,我们必须将数据移动到本地时间,以防止混淆。
例子:
var select = queryable.Select(string.Format("new ({0}, {1})", datetimeColumn, someOtherColumn));
通常在我们的 tsql 甚至在使用 lambda 表达式的实体框架中,您可以添加所需的偏移量。但是在动态 linq 选项中,您似乎无法像使用 Linq2Sql 那样执行任何日期操作,例如 DateTime.AddHours(x) 或 DateTime.Subtract(x)。 Entity Framework 6 希望你使用DbFunctions.AddHours(x) 等。但是,如果没有修改,动态 linq 代码将不会无错误地接受 DbFunctions。
例子:
var select = queryable.Select(string.Format("new (System.Data.Entity.DbFunctions.AddHours({0},7) as {0}, {1})", datetimeColumn, someOtherColumn));
返回错误:XXX 类型中不存在任何属性或字段“系统”
(删除命名空间没有帮助)。
使用所需的代码:
var select = queryable.Select(string.Format("new ({0}.AddHours(7), {1})", datetimeColumn, someOtherColumn));
结果错误:LINQ to Entities 无法识别方法“System.DateTime AddHours(Double)”方法,并且该方法无法转换为存储表达式。
我想让 SQL 在 groupby 之前执行日期时间数学。一旦 groupby 发生,就不再有 UTC 的概念,因为用户将看到本地化的结果集。
恐怕我只是用一些扩展来更新我的 github fork 以支持传入实体框架扩展,但在我这样做之前,想看看其他人是否有解决方案或想法。
注意:由于可能更改 SQL 数据存储技术,我没有使用 DateTimeOffset。
【问题讨论】:
标签: c# .net entity-framework-6 dynamic-linq