2011-03-30 268 views
3

我有很长的LINQ到实体查询: -LINQ到实体无法识别方法

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到实体不承认 该方法 “System.Linq.IQueryable`1 [ExpediaReports.Models.ReportModel] 选择[<> F_ AnonymousType1`3,ReportModel](System.Linq.IQueryable`1 [<>˚F _Ano [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)无法识别的方法。

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

什么这些字符这里的意思:'<>“等

+0

哇,你有没有听说过你可以在多个表达式中表达同一个东西,并且它使得你的代码更易于阅读和调试:)是否有任何理由将所有记录映射到ReportModel,并且之后只需要5个他们,先拿5先不会更快? – Silx 2011-03-30 09:57:26

回答

10

‘这种方法不能被翻译成店表达’是指LINQ到实体无法翻译您的查询的SQL。

当你在.Select()函数中尝试以不能直接转换为SQL的方式操作结果时(例如运行函数时),通常会发生这种情况。我敢打赌,“a.sit.Date.ToString()”行导致了这个问题。只要在调用.ToList()之后返回日期并格式化,我就会打赌问题会消失。

这可能会令人沮丧 - Linq to SQL在运行类似于你的.Select()函数中复杂函数的查询时会更好。请记住,Linq to Entities在它将转换为SQL的函数上非常有限。

+0

是的,谢谢你,这是唯一的问题。我在最后一个.Where()之前应用了.ToList()并解决了它。谢谢。 – teenup 2011-03-30 09:56:37

+2

这里有一个支持的方法列表:http://msdn.microsoft.com/en-us/library/bb738550.aspx – 2011-03-30 09:57:22

+0

@Tim:谢谢,这是一个很好的资源。 – 2011-03-30 09:59:34

1

使用ToString确实不起作用,但这里的问题是.Select((a, i) =>此版本的Select不支持Linq-to-entities。例外说它。

相关问题