gpt4 book ai didi

c# - EF Core 查询存储过程映射到类型

转载 作者:行者123 更新时间:2023-12-02 00:27:55 25 4
gpt4 key购买 nike

我有一个项目需要查询数据库并将结果返回给 web api。数据库管理员即时创建了几个存储过程,它们有一个 UI,用于创建存储过程的定义及其名称,Web API 服务仅调用该 SP 并应返回结果。基于以下代码,我无法将对象返回到 Web API Controller ,因为对象包含项目但没有映射属性。

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

最佳答案

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

在您的 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));

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

问候。

关于c# - EF Core 查询存储过程映射到类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53041769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com