我正在尝试获取保存在缓存中的数据。但它会在“选择新的 FilterSsrsLog”行上引发异常。异常:此函数只能从 LINQ to Entities 调用
List<ExecutionLog3> reportServerDB = UpdateCache();
var reportLog = (from r in reportServerDB
orderby r.TimeStart descending
where ((model.reportName == null ? true : r.ItemPath.Contains(model.reportName)) &&
(model.reportFolder == null ? true : r.ItemPath.Contains(model.reportFolder)) &&
(r.TimeStart >= startDateTime) &&
(r.TimeStart <= endDateTime)
)
select new FilterSsrsLog
{
UserName = r.UserName,
ReportName = r.ItemPath,
ReportFolder = r.ItemPath,
Format = r.Format,
Parameters = r.Parameters,
TimeStart = r.TimeStart,
TimeEnd = r.TimeEnd,
TotalTime = EntityFunctions.DiffMilliseconds(r.TimeStart, r.TimeEnd)
});
如果我删除“select new FilterSsrsLog”代码块并写入“select r”,它就可以工作。但是我只需要那些列,那么我该怎么做才能解决这个问题呢?
最佳答案
您收到此错误的原因是查询是在内存中执行的,而不是在 RDBMS 中执行的。 DiffMilliseconds
函数是一个标记, Entity Framework 提供程序将其转换为 RDBMS 特定的 SQL 以发送到您的 RDBMS。该函数在应用于 IQueryable<T>
时不计算其结果在内存中,而是抛出异常。
如果你想在内存中运行这个查询,替换
TotalTime = EntityFunctions.DiffMilliseconds(r.TimeStart, r.TimeEnd)
与
TotalTime = (r.TimeEnd - r.TimeStart).TotalMilliseconds
两个日期相减产生 TimeSpan
您可以从中获取其 TotalMilliseconds
的值属性(property)。
关于c# - linq 异常 : This function can only be invoked from LINQ to Entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18166183/