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]
Порядок полностью не переведен.
В чем проблема? Это одна и та же лямбда-функция, единственное отличие во втором случае, она сначала присваивается переменной.
1 ответ
Решение
Потому что в мире IQueryable вам нужно Expression<Func<TModel, TValue>>
в качестве параметра расширения OrderBy, а не Func<TModel, TValue>
http://msdn.microsoft.com/en-us/library/system.linq.queryable.orderby