c# - linq 异常 : This function can only be invoked from LINQ to Entities

标签 c# linq

我正在尝试获取保存在缓存中的数据。但它会在“选择新的 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/

相关文章:

c# - 使用c#在ACCESS DATABASE中搜索记录

c# - 'void' 没有重载匹配委托(delegate) 'ThreadStart'

c# - 如何比较 Roslyn 中不同项目的类型符号 (ITypeSymbol)?

c# - 如何在运行时计算代码的校验和?

c# - ADO.NET Entity Framework ObjectContext - 缓存问题

c# - "fix" "dynamic"IEnumerable 是否有规范的方法?

c# - 如何忽略第一个小数点后的第一个值(如果它是 0),否则如果大于 0,则取它?

linq - 使用 LINQ 从另一个表更新 DataTable

c# - 在组连接 linq 查询中将字符串转换为十进制

C# 列表方法 : ElementAt(index) vs Find(content)