【问题标题】:EF Core query stored procedure map to typesEF Core 查询存储过程映射到类型
【发布时间】:2018-10-29 08:50:18
【问题描述】:

我有一个项目需要查询数据库并将结果返回到 web api。 有几个存储过程由 DB 管理员动态创建,它们有一个 UI,他们创建存储过程的定义及其名称,Web api 服务只调用该 SP 并应返回结果。 根据下面的代码,我无法将返回对象返回到 web api 控制器,因为对象包含项目但没有映射属性。

var result = dbContext.Query<object>().AsNoTracking().FromSql(
            "dbo.MY_SP @DateFrom=@DateFrom, @DateTo=@DateTo",
            dateFromParam, dateToParam).ToList();

【问题讨论】:

  • 你依赖的模型是什么?
  • 模型应该在运行时根据用户通过 UI 输入的 SP 列创建。
  • 在这种情况下,您最好绕过 EF,直接使用 ADO.NET,或者使用 Dapper。

标签: c# .net entity-framework entity-framework-core


【解决方案1】:

在您的情况下,您需要使用动态来表示存储过程的结果。

在您的 DbContext 类中添加以下方法:

public IEnumerable<dynamic> GetDynamicResult(string commandText, params SqlParameter[] parameters)
{
    // Get the connection from DbContext
    var connection = DbContext.Database.GetDbConnection();

    // Open the connection if isn't open
    if (connection.State != System.Data.ConnectionState.Open)
        connection.Open();

    using (var command = connection.CreateCommand())
    {
        command.CommandText = commandText;
        command.Connection = connection;

        if (parameters?.Length > 0)
        {
            foreach (var parameter in parameters)
            {
                command.Parameters.Add(parameter);
            }
        }

        using (var dataReader = command.ExecuteReader())
        {
            // List for column names
            var names = new List<string>();

            if (dataReader.HasRows)
            {
                // Add column names to list
                for (var i = 0; i < dataReader.VisibleFieldCount; i++)
                {
                    names.Add(dataReader.GetName(i));
                }

                while (dataReader.Read())
                {
                    // Create the dynamic result for each row
                    var result = new ExpandoObject() as IDictionary<string, object>;

                    foreach (var name in names)
                    {
                        // Add key-value pair
                        // key = column name
                        // value = column value
                        result.Add(name, dataReader[name]);
                    }

                    yield return result;
                }
            }
        }
    }
}

现在您可以通过这种方式调用您的存储过程:

var result = dbContext.GetDynamicResult(" exec [dbo].[MySp] @dateFrom, @dateTo ", new SqlParameter("@dateFrom", dateFrom), new SqlParameter("@dateTo", dateTo));

如果这个答案有用,请告诉我。

问候。

【讨论】:

  • 很有用。所以使用 EF Core Query 是不可能的?
  • 我尝试使用动态作为查询类型,但没有用
  • 是的,我也试过了。不知道这是否是 EF Core 的错误或它是如何设计的,但为 EF Core 提供此功能应该很有用
猜你喜欢
  • 2020-10-06
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多