2016-09-16 3 views
2

Как я могу сделать этот OrderBy код работы thisEntity Framework запросСделать Math.log работу в Entity Framework Query

Это OrderBy часть запроса

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

Entity Framework пытается перевести Math.Log функцию в SQL, так что он может быть выполнен с БД, но это не делает знайте, как это сделать для Math.Log.

  • Одним из решений является получение всех элементов в памяти с помощью .ToList() и выполнить Math.Log в памяти с помощью LINQ к объектам.
  • Другим решением является использование существующих SqlFunctions.Log.

Это, как вы могли бы написать OrderBy:

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

Я отбрасываю двойное число и после запуска кода получаю это исключение: указанный метод «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