LINQ to Entities不识别方法

3

我有一个很长的Linq To Entities查询:

reports = db.CallProfileDailies
    .Join(db.ReportDailyTotals, 
          cpd => cpd.Date, 
          rdt => rdt.Date, 
          (cpd, rdt) => new { cpd = cpd, rdt = rdt })
    .Where(a => a.cpd.Skill == a.rdt.Skill)
    .Join(db.SummaryIntervalTotals, 
          a => a.rdt.Date, 
          sit => sit.Date,
          (a, sit) => new { cpd = a.cpd, rdt = a.rdt, sit = sit })
    .Where(a => a.rdt.Skill == a.sit.Skill)
    .Select((a, i) => new ReportModel
    {
        AverageAbandonDelay = a.sit.AvgAbanTime,
        AverageAfterCallWorkTime = a.sit.AvgAcwTime,
        AverageHandleTime = (a.sit.AvgAcwTime + a.sit.AvgAcdTime),
        AverageSpeedOfAnswer = a.sit.AvgSpeedAns,
        AverageTalkTime = a.sit.AvgAcdTime,
        CallsAnswered = a.sit.AcdCalls,
        Date = a.sit.Date.ToString(),
        MaximumDelay = a.sit.MaxDelay,
        PercentageAbandon = (a.sit.AbanCalls / (a.sit.AcdCalls + a.sit.AbanCalls)),
        TotalCallsAbandon = a.sit.AbanCalls,
        TotalCallsOffered = (a.sit.AcdCalls + a.sit.AbanCalls),
        TotalHandleTime = (a.rdt.HoldTime + a.rdt.AcdTime + a.rdt.AcwTime)
    }).Take(5).ToList();

我在运行时遇到了以下错误:

LINQ to Entities不认识方法'System.Linq.IQueryable`1[ExpediaReports.Models.ReportModel] Select[<>f_AnonymousType1`3,ReportModel](System.Linq.IQueryable`1[<>f_AnonymousType1`3[ExpediaReports.CallProfileDaily,ExpediaReports.ReportDailyTotal,ExpediaReports.SummaryIntervalTotal]], System.Linq.Expressions.Expression`1[System.Func`3[<>f__AnonymousType1`3[ExpediaReports.CallProfileDaily,ExpediaReports.ReportDailyTotal,ExpediaReports.SummaryIntervalTotal],System.Int32,ExpediaReports.Models.ReportModel]])',并且该方法无法转换为存储表达式。

我只是想理解这个错误的含义。我甚至无法读取Linq To Entities不能识别哪个方法。

如何阅读此错误并识别未识别的方法,以便我可以相应地更改查询?

这里的这些字符是什么意思:`<>`等等。


哇,你有没有听说过同一件事情可以用多种表达方式来让你的代码更易于阅读和调试呢 :) 你为什么要将所有记录映射到ReportModel中,然后再只取其中的5个呢?难道先取前5个不会更快吗? - Silx
2个回答

10
"

这个方法无法转换成存储表达式

" 的意思是 Linq to Entities 无法将你的查询转换为 SQL。
当你在 .Select() 函数中尝试以无法直接转换为 SQL 的方式操作结果时,比如运行函数时,通常会发生这种情况。我敢打赌 "a.sit.Date.ToString()" 这一行代码是导致问题的原因。只需在调用 .ToList() 后返回日期并进行格式化,我敢保证问题就会解决。
这可能会让人沮丧——Linq to SQL 在处理像这样在 .Select() 函数中具有复杂函数的查询时要好得多。请记住,Linq to Entities 对它能够转换为 SQL 的函数非常有限。"

是的,非常感谢,这就是唯一的问题。我在最后一个 .Where() 之前应用了 .ToList(),问题得到解决。谢谢。 - teenup
2
这里有一个支持的方法列表:http://msdn.microsoft.com/zh-cn/library/bb738550.aspx - Tim Croydon
@Tim:谢谢,这是一个很棒的资源。 - Dave Markle

1

使用 ToString 真的不起作用,但问题在于这里的 .Select((a, i) => 这个版本的 Select 不受 Linq-to-entities 支持。异常就是这么说的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接