1

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

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

В SQL Profiler, это переведенный 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] 

OrderBy полностью не переведена.

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

ответ

2

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

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

+0

Спасибо. Обертка функции с выражением решила проблему. Но почему нет компиляции при передаче функции OrderBy? –

+0

Кроме того, я знаю, что могу обернуть функцию с выражением типа: Выражение > f = x => x.Name; Но если у aleady есть переменная функции, как я могу преобразовать ее в выражение? –

+0

@NanLi Ошибка компиляции, поскольку IQueryable наследует от IEnumerable, которые имеют метод OrderBy с параметром 'Func '. Для второго вопроса см. Это: http://stackoverflow.com/questions/767733/converting-a-net-funct-to-a-net-expressionfunct –