2011-03-30 136 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。例外說它。

相關問題