У меня есть пользовательская функция CLR Aggregate на SQL Server для вычисления процентилей. Можно ли вызвать мою пользовательскую агрегатную функцию через Entity Framework? Как настроено сопоставление, чтобы разрешить это?
Я попытался использовать функции codefirst, аналогичные описанным в Entity Framework 6 Code First Custom Functions., однако функциям, по-видимому, разрешено принимать только параметры масштабирования, где моя функция является агрегатной функцией, поэтому ей нужно будет принимать список элементов (аналогично тому, как работают 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
[DbFunction("CodeFirstDatabaseSchema", "Percentile")]
, а подпись должна бытьpublic static Double Percentile(Double value, Int16 tile)
. - person Solomon Rutzky   schedule 30.10.2015IEnumerable
вокруг обоих входных параметров, а не только первого, верно? - person Solomon Rutzky   schedule 30.10.2015SqlFunctions.ChecksumAggregate
, которая выполняет агрегат, поэтому это кажется возможным, но не уверен, как обновить внутреннюю модель функций EF, доступных в базе данных. - person Alex   schedule 30.10.2015