Кодекс сначала Entity Framework 6.1 Пользовательская агрегатная функция
У меня есть пользовательская функция агрегирования CLR на SQL Server для расчета процентилей. Можно ли вызвать мою пользовательскую агрегатную функцию через Entity Framework? Как сопоставление настроено для этого?
Я пытался использовать функции codefirst, аналогичные описанным наEntity Framework 6 Code Первые пользовательские функцииоднако, похоже, что функциям разрешено принимать только параметры масштабирования, где моя функция является агрегатной функцией, поэтому необходимо будет взять список элементов (аналогично тому, как работают Sum, Averagg и Count).
Агрегатные функции имеют следующую сигнатуру, принимая значение, от которого мы хотим получить медиану и процентиль (50 - медиана, 25 - нижний квартиль, 75 - верхний квартиль)
CREATE AGGREGATE [dbo].[Percentile]
(@value [float], @tile [smallint])
RETURNS[float]
EXTERNAL NAME [SqlFuncs].[Percentile]
GO
Я попытался добавить DbFunctionAttribute, но не совсем уверен, как подключить его к модели хранилища структуры сущностей, используя код в первую очередь.
[DbFunction("SqlServer", "Percentile")]
public static double? Percentile(IEnumerable<int?> arg, int tile)
{
throw new NotSupportedException("Direct calls are not supported.");
}
Что я ищу, так это чтобы я мог написать что-то вроде
paymentsTable
.GroupBy(x=>x.CustomerId)
.Select(new{
Median = MyDbContext.Percentile(x.Select(g=>g.Amount), 50)
});
Который будет отображаться в SQL как
SELECT [dbo].[Percentile](Amount, 50) as Median
FROM Payments
GROUP BY CustomerId