Я немного провалился, пытаясь выполнить оконную функцию в Entity Framework.(Рассматриваемый проект построен на EF, но много выиграл бы от вычисления PERCENTILE_DISC на SQL Server.)
Я создаю новое соглашение и добавляю его в объектную модель для преобразования вызовов определенного метода.в SQL, который выполняет оконную функцию PERCENT_DISC.
Созданная EdmFunction имеет CommandText:
PERCENTILE_DISC (0.8) WITHIN GROUP (ORDER BY o.ExpectedPayment) OVER (PARTITION BY o.OrderType)
Но когда я делаю это для выполнения функции:
var medians = context.Set<UserLocation>().Select(x => CustomFunction.Percentile()).ToList();
Это вызывает исключение EntityCommandCompilationException со следующим сообщением:
System.Data.Entity.Core.EntityCommandCompilationException:
'An error occurred while preparing definition of the function 'ConsoleApp5.Percentile'. See the inner exception for details.'
Inner Exception:
EntitySqlException: The query syntax is not valid. Near identifier 'WITHIN', line 1, column 35.
И все же этот прямой запрос дает ожидаемые результаты:
var p80s = context.Database.SqlQuery<decimal>("SELECT DISTINCT PERCENTILE_DISC (0.8) WITHIN GROUP (ORDER BY o.ExpectedPayment) OVER (PARTITION BY o.OrderType) from Orders o").ToList();
Я подозреваю, что это связано с тем, что анализатор EF не был созданобрабатывать оконные функции.Итак, я хотел бы иметь возможность переопределить это EntityCommandCompilationException и заставить EF попытаться выполнить запрос в любом случае.В противном случае я хотел бы, по крайней мере, увидеть созданный SQL-запрос, чтобы увидеть, есть ли другая проблема, вызывающая действительно недействительный SQL-запрос.Как я могу выполнить любой из этих?