【问题标题】:Error using EF6 DbFunctions.TruncateTime comparing DateTime使用 EF6 DbFunctions.TruncateTime 比较 DateTime 时出错
【发布时间】:2014-09-07 19:04:29
【问题描述】:

我正在尝试使用以下代码从数据范围中检索一些数据:

    var rotas = db.X.Where(r => r.DataDaExecucao != null)
    .Where(r => System.Data.Entity.DbFunctions.TruncateTime(r.Date.Value) >=         System.Data.Entity.DbFunctions.TruncateTime(startDateTime))
    .Where(r => System.Data.Entity.DbFunctions.TruncateTime(r.Date.Value) < System.Data.Entity.DbFunctions.TruncateTime(endDateTime))
    .Join(db.T, r => r.Id, t => t.X_Id.Value,
    (r, t) => new
    {
    id = r.Id,
    start = r.Date.Value.ToString("s"),
    end = r.Date.Value.AddDays(1).ToString("s"),
    title = t.Z.Name,
    allday = false
    }).ToList();

“日期”属性为 Nullable

我收到以下错误消息:

LINQ to Entities 无法识别方法“System.String ToString(System.String)”方法,并且该方法无法转换为存储表达式。

异常详细信息:System.NotSupportedException:LINQ to Entities 无法识别方法“System.String ToString(System.String)”方法,并且此方法无法转换为存储表达式。

另外,我的 csproj 中没有引用 System.Data.Entity.dll 程序集。

想法?

提前谢谢你。

【问题讨论】:

  • 与System.Data.Entity有关,你有什么EF版本,你用的是什么.net框架版本?

标签: c# linq entity-framework datetime


【解决方案1】:

您可以使用 SqlFunctions 更改匿名类型,它还会生成 sql 查询。

在您的情况下,您使用ToString("s"),这意味着您想要获取可以替换为SqlFunctions::DatePart 的秒的日期部分。并且Date::AddDays 可以替换为SqlFunctions::DateAdd

new
{
    id = r.Id,
    start = SqlFunctions.DatePart("s", r.Date),
    end = SqlFunctions.DatePart("s", SqlFunctions.DateAdd("d", 1, r.Date)),
    title = t.Z.Name,
    allday = false
}

【讨论】:

    【解决方案2】:

    DateTime.ToString() 无法通过 LINQ to Entities 转换为 SQL 语句。例如

    开始 = r.Date.Value.ToString("s")

    要做的事情是调用 .ToList() 来强制 LINQ to Entities 执行其底层 SQL 查询。这样,LINQ 语句的其余部分将使用 LINQ to Objects(对象集合的内存查询)。

    在你的情况下,我会将 LINQ 语句分成两部分:

    1. 前半部分使用 LINQ to Entities SQL 生成查询数据库,最后调用 .ToList()
    2. 后半部分运行 LINQ to Objects 以执行内存部分。

    【讨论】:

    • .ToList() 强制完全检索任何选定的行。这在只需要一个小结果集的情况下可能没问题,但在其他方面是一个真正让事情停下来的好方法。
    猜你喜欢
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2011-01-11
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多