2016-09-16 44 views
2

我怎樣才能讓這個排序依據代碼工作thisEntity框架查詢請在實體框架查詢Math.Log工作

這是查詢的排序依據部分

orderby (double)b.score * Math.Pow((1 + Math.Log(b.total_votes)), 0.2) 

我得到這個異常:

LINQ to Entities does not recognize the method 'Double Log(Double)' method, and this method cannot be translated into a store expression. 

我該如何讓它工作?

+0

多少條記錄你看着取材? – sachin

+0

如果你不需要在db中進行排序,你可以調用'ToList()'在排序之前獲取結果。 –

+0

@sachinabout約10 –

回答

2

實體框架試圖使之能夠對數據庫執行,以Math.Log功能轉化爲SQL,但它不知道如何爲Math.Log做到這一點。

  • 一種解決方案是使用 .ToList()檢索所有項目到內存中,並使用LINQ to對象在內存中執行Math.Log
  • 另一種解決方案是使用現有的SqlFunctions.Log

這是你如何可以寫你的排序依據:

orderby (double)b.score * Math.Pow((1 + SqlFunctions.Log(b.total_votes) ?? default(double)), 0.2) 

如果恰好有10條記錄,這是你如何可以在內存中進行排序:

from b in _dataContext.MyTypes.ToList() orderby (double)b.score * Math.Pow((1 + Math.Log(b.total_votes)), 0.2) select b; 
+0

total_votes是什麼類型?嘗試將b.total_votes加倍。 – sachin

+0

我強制轉換爲double,在運行代碼之後,我得到以下異常:類型爲System的指定方法'System.Nullable'1 [System.Double] Log(System.Nullable'1 [System.Double])' .Data.Entity.SqlServer.SqlFunctions'不能轉換爲LINQ to Entities存儲表達式。我的代碼:orderby(double)b.score * Math.Pow((1 + System.Data.Entity.SqlServer.SqlFunctions.Log((double)b.total_votes)?? default(double)),0.2)。總票數是long類型。 –

+1

我想你可以用第二種方法,因爲你說只有10條記錄。 – sachin