Выполнения: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 полностью не переведена.
В чем проблема? Они являются одной и той же лямбда-функцией, единственная разница во втором случае, она сначала назначается переменной.
Спасибо. Обертка функции с выражением решила проблему. Но почему нет компиляции при передаче функции OrderBy? –
Кроме того, я знаю, что могу обернуть функцию с выражением типа: Выражение> f = x => x.Name; Но если у aleady есть переменная функции, как я могу преобразовать ее в выражение? –
@NanLi Ошибка компиляции, поскольку IQueryable наследует от IEnumerable, которые имеют метод OrderBy с параметром 'Func'. Для второго вопроса см. Это: http://stackoverflow.com/questions/767733/converting-a-net-funct-to-a-net-expressionfunct –