Выполнение хранимой процедуры с помощью 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# для построения строки запроса.