【问题标题】:How to execute stored procedure in EF Core with return value TResult如何在 EF Core 中使用返回值 TResult 执行存储过程
【发布时间】:2019-08-04 05:23:45
【问题描述】:

我创建了一个返回类型为 TResult 的异步方法,但返回值出错。

我尝试返回一个列表值,但出现错误:

public async Task<IList<T>> ExecWithStoreProcedureGetListAsync<T>(string query, params object[] parameters)
{
        query = "EXEC " + query + " ";

        foreach (var item in parameters)
        {
            var cItem = (SqlParameter)item;
            query = query + "@" + cItem.ParameterName + " " + (cItem.Direction == System.Data.ParameterDirection.Output ? "out" : "") + ",";
        }

        query = query.Substring(0, query.Length - 1);

        return await this.context.Database.SqlQuery<T>(query, parameters).ToListAsync();
    }

错误:

“DatabaseFacade”不包含“SqlQuery”的定义,并且找不到接受“DatabaseFacade”类型的第一个参数的可访问扩展方法“SqlQuery”(您是否缺少 using 指令或程序集引用?)

【问题讨论】:

    标签: entity-framework asp.net-core


    【解决方案1】:

    EF Core 提供以下方法来执行存储过程:

    1. DbSet.FromSql()

    2. DbContext.Database.ExecuteSqlCommand()

    使用 FromSql

    该方法执行返回实体数据的存储过程

    using (var context = new SampleContext())
    {
     var authorId = new SqlParameter("@AuthorId", 1);
     var books = context.Books
        .FromSql("EXEC GetBooksByAuthor @AuthorId" , authorId)
        .ToList();
     }
    

    使用 ExecuteSqlCommand()

    此方法返回一个整数,指定受传递给它的 SQL 语句影响的行数。有效的操作是 INSERT、UPDATE 和 DELETE。该方法不用于返回实体

    using(var context = new SampleContext())
    {
       var name = new SqlParameter("@CategoryName", "Test");
       context.Database.ExecuteSqlCommand("EXEC AddCategory @CategoryName", name);
    }
    

    参考:

    https://www.learnentityframeworkcore.com/raw-sql#stored-procedures

    https://docs.microsoft.com/en-us/ef/core/querying/raw-sql

    https://www.entityframeworktutorial.net/efcore/working-with-stored-procedure-in-ef-core.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多