使用EF6 DbFunctions.TruncateTime比较DateTime时出错

时间:2014-07-17 03:43:57

标签: 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 => 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();

“Date”属性是Nullable&lt;日期时间&GT;

我收到以下错误消息:

  

LINQ to Entities无法识别方法'System.String ToString(System.String)'方法,并且此方法无法转换为商店表达式。

     

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

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

想法?

提前谢谢你。

2 个答案:

答案 0 :(得分:1)

LINQ to Entities无法将DateTime.ToString()转换为SQL语句。 e.g。

  

start = r.Date.Value.ToString(&#34; s&#34;)

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

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

  1. 上半部分使用LINQ to Entities SQL生成查询数据库,并在末尾调用.ToList()
  2. 下半部分运行LINQ to Objects来执行内存部分。

答案 1 :(得分: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
}