Одной из слабостей Entity Framework 6 Code First является отсутствие встроенной поддержки вызова конструкций базы данных (представлений, хранимых процедур и т. д.). Для тех, кто не знаком с Code-First в Entity Framework (EF) или не использовал его, Code-First — это просто Fluent API для маппинга. Идея заключается в том, чтобы создать все маппинги базы данных в коде (например, на C#), а затем фреймворк создает и отслеживает изменения в схеме базы данных.
В традиционном Entity Framework для вызова хранимой процедуры вы должны были отобразить её в файле EDMX. Это многоэтапный процесс. После завершения процесса создается метод, который привязывается к DataContext.
Я стремился упростить вызов хранимой процедуры. В основе хранимой процедуры лежат имя процедуры, N количество параметров и набор результатов. Я написал небольшой метод расширения, который принимает имя процедуры, параметры и тип возвращаемого значения. Это просто работает. Никакого маппинга процедуры и её параметров.
public static List<TReturn> CallStoredProcedure<TParameters, TReturn>(this DataContext context, string storedProcedure, TParameters parameters) where TParameters : class where TReturn : class, new()
{
IDictionary<string,object> procedureParameters = new Dictionary<string, object>();
PropertyInfo[] properties = parameters.GetType().GetProperties();
var ps = new List<object>();
foreach (var property in properties)
{
object value = property.GetValue(parameters);
string name = property.Name;
procedureParameters.Add(name, value);
ps.Add(new SqlParameter(name, value));
}
var keys = procedureParameters.Select(p => string.Format("@{0}", p.Key)).ToList();
var parms = string.Join(", ", keys.ToArray());
return context.Database.SqlQuery<TReturn>(storedProcedure + " " + parms, ps.ToArray()).ToList();
}
Использование
var context = new DataContext();
List<User> users = context.CallStoredProcedure<object,User>("User_GetUserById", new{userId = 3});
Автор: Chuck Conway — инженер AI с почти 30-летним опытом разработки программного обеспечения. Он создает практические системы AI — конвейеры контента, агенты инфраструктуры и инструменты, которые решают реальные проблемы — и делится тем, что он узнает на этом пути. Свяжитесь с ним в социальных сетях: X (@chuckconway) или посетите его на YouTube и на SubStack.