C# 使用EF6 DbFunctions.TruncateTime比较日期时间时出错

C# 使用EF6 DbFunctions.TruncateTime比较日期时间时出错,c#,linq,entity-framework,datetime,C#,Linq,Entity Framework,Datetime,我正在尝试使用以下代码从数据区域检索一些数据: 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 =

我正在尝试使用以下代码从数据区域检索一些数据:

    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();
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)r.Id,T=>T.X_Id.Value,
(r,t)=>新
{
id=r.id,
开始=r.Date.Value.ToString(“s”),
end=r.Date.Value.AddDays(1).ToString(“s”),
title=t.Z.Name,
全天=假
}).ToList();
“日期”属性可为空

我收到以下错误消息:

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

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

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

想法

提前感谢您。

DateTime.ToString()不能由LINQ转换为SQL语句。e、 g

开始=r.Date.Value.ToString(“s”)

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

在您的情况下,我将LINQ语句分为两部分:

  • 前半部分使用LINQ查询数据库以生成实体SQL,并在最后调用.ToList()
  • 第二部分运行LINQ to对象来执行内存中的部分

  • 您可以使用where更改匿名类型,它也将生成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
    }
    

    与System.Data.Entity相关,您有什么EF版本以及您使用的是什么.net framework版本?.ToList()强制对所选的任何行进行完整检索。如果只需要一个很小的结果集,这可能没问题,但如果不是这样的话,这是一个很好的方法,可以让事情停下来。