Выполнение хранимой процедуры с помощью entity framework
можно ли выполнить хранимую процедуру с помощью EF, которая выбирает записи из базы данных из двух или более таблиц с помощью внутреннего соединения и левого внешнего соединения.
моя точка зрения состоит в том, чтобы избежать метода объединения в EF или LINQ, с которым у меня много проблем.
поэтому, если я создам эту процедуру, могу ли я вызвать ее с параметрами из пользовательского ввода, могу назначить результат .ToList()
метод, а затем добавьте результат в asp: repeater .DataSource
.
Я знаю это может быть странный вопрос, но я хочу это сделать по многим причинам во-первых, использовать EF, потому что я чувствую себя более комфортно. во-вторых, чтобы избавиться от использования соединений в EF. в-третьих, я где-то читал, что использование хранимых процедур повысит производительность запросов при частом вызове запроса.
Если кто может помочь мне ответить на эти вопросы на примере я буду признателен.
4 ответов
можно назвать SqlQuery
из контекста данных Entity Framework.
context.Database.SqlQuery<YourType>("exec usp_StoredProcedure").ToList()
вам понадобится класс для сопоставления результатов запроса, например:
public class YourType
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}
вы также можете указать параметры запроса, как показано ниже:
SqlParameter parameter1 = new SqlParameter("@Parameter1", "Value");
context.Database.SqlQuery<YourType>("exec usp_StoredProcedure @Parameter1", parameter1).ToList()
мы увидим, как выполнить хранимую процедуру в Entity Framework, в MVC мы увидим, как добавить EF.
выполните следующий сценарий в базе данных для создания хранимой процедуры.
CREATE PROCEDURE FETCHEMPLOYEES AS
BEGIN
SELECT * FROM EMPTABLE
END
CREATE PROCEDURE FETCHEMPLOYEE(@ID INT) AS
BEGIN
SELECT * FROM EMPTABLE WHERE ID = @ID
END
public class EmpModel
{
EmployeeEntities empdb = new EmployeeEntities();
public List<EMPTABLE> GetEmployees()
{
return empdb.FETCHEMPLOYEES().ToList();
}
public EMPTABLE GetEmployee(int? id)
{
return empdb.FETCHEMPLOYEE(id).ToList().Single();
}
}
public class EmployeeController : Controller
{
Models.EmpModel mod = new Models.EmpModel();
public ActionResult Index()
{
List<EMPTABLE> result = mod.GetEmployees();
return View(result);
}
public ActionResult Details(int id)
{
EMPTABLE result = mod.GetEmployee(id);
return View(result);
}
}
для больше деталей шага за шагом, пожалуйста см. следующую ссылку: http://dotnetvisio.blogspot.in/2014/01/execute-stored-procedure-using-entity.html
можно использовать ExecuteFunction
of ObjectContext
класс:
public virtual ObjectResult<CustomClassForStoreReturnedData> NameOfStoredProcedure(Nullable<int> tableID)
{
var IDParameter = tableID.HasValue ?
new ObjectParameter("tableID", tableID) :
new ObjectParameter("tableID", typeof(int));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<CustomClassForStoreReturnedData>("NameOfStoredProcedureInSQLDatabase", IDParameter);
}
В вы используете Entity Framework с MySQL:
в этом примере, моя хранимая процедура ожидает один параметр, по имени myParam of тип тип bigint
var myParam = new SqlParameter("@myParam", (MySqlDbType.Int64)).Value = 100;
var res = _context.Database.SqlQuery<MyEntity>($"call MyProcedureName({pyParam})");
обратите внимание, что я использую Интерполяция Строк C# для построения строки запроса.