2014-02-28 59 views
3

我有一個簡單的表(SQL服務器和EF6)Myvalues,與列編號 & 價值(雙)如何在LINQ中使用Math.X函數?

我試圖讓所有的值在這自然對數的總和表。我的LINQ的說法是:

  var sum = db.Myvalues.Select(x => Math.Log(x.Value)).Sum(); 

它編譯罰款,但我發現了一個RTE:

LINQ到實體無法識別方法「雙對數(雙人間)」的方法,而這種方法不能被翻譯成商店表達。

我在做什麼錯誤/我該如何解決這個問題?

FWIW,我可以針對這給了我正確的答案的數據庫直接執行下面的SQL查詢:

select exp(sum(LogCol)) from 
    (select log(Myvalues.Value) as LogCol From Myvalues 
) results 

回答

5

LINQ試圖所以它是對DB執行Math.Log轉換爲SQL命令。

這不支持。

  • 第一種解決方案(對於SQL Server)是使用現有的SqlFunctions之一。更具體地說,SqlFunctions.Log

  • 另一種解決方案是使用.ToList()從數據庫中檢索所有項目,並使用LINQ to Objects(而不是LINQ to Entities)執行Math.Log

2

由於EF無法翻譯Math.Log()你可以在內存中獲取數據,並執行函數形式的客戶端:

var sum = db.Myvalues.ToList().Select(x => Math.Log(x.Value)).Sum();