OrderBy не транслируется в SQL при передаче функции выбора

Когда я выполняю:

var t = db.Table1.OrderBy(x => x.Name).ToList();

В профилировщике SQL это переведенный SQL:

SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[Name] AS [Name]
FROM [dbo].[Table1] AS [Extent1]
ORDER BY [Extent1].[Name] ASC

Что правильно.

Однако, если я передам функцию выбора в OrderBy:

Func<Table1, string> f = x => x.Name;
var t = db.Table1.OrderBy(f).ToList();

Переведенный SQL:

SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[Name] AS [Name]
FROM [dbo].[Table1] AS [Extent1]

Заказ полностью не переведен.

В чем проблема? Это одна и та же лямбда-функция, разница только во втором случае, она сначала присваивается переменной.


person Nan Li    schedule 31.08.2012    source источник


Ответы (1)


Потому что в мире IQueryable вам нужен Expression<Func<TModel, TValue>> в качестве параметра расширения OrderBy, а не Func<TModel, TValue>

http://msdn.microsoft.com/en-us/library/system.linq.queryable.orderby

person Raphaël Althaus    schedule 31.08.2012
comment
Спасибо. Обертывание функции выражением решило проблему. Но почему нет ошибки компиляции, когда я передаю функцию в OrderBy? - person Nan Li; 31.08.2012
comment
Кроме того, я знаю, что могу обернуть функцию выражением вроде: Expression‹Func‹Table1, string›› f = x =› x.Name; Но если у меня уже есть функциональная переменная, как я могу преобразовать ее в выражение? Спасибо - person Nan Li; 31.08.2012
comment
@NanLi нет ошибки компиляции, потому что IQueryable наследуется от IEnumerable, у которого есть метод OrderBy с параметром Func<TModel, TValue>. По второму вопросу см. это: stackoverflow.com/questions/767733/ - person Raphaël Althaus; 01.09.2012
comment
@NanLi Мне также любопытно: stackoverflow.com/questions/12222006/ - person Raphaël Althaus; 01.09.2012