我正在尝试使用以下代码从数据范围中检索一些数据:
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程序集。
想法?
提前谢谢你。
答案 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 :(得分: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
}