[英]EF Core query stored procedure map to types
我有一個需要查詢數據庫並將結果返回到Web api的項目。 DB Admin即時創建了幾個存儲過程,它們具有一個UI,用於創建存儲過程的定義及其名稱,並且Web api服務僅調用該SP並應返回結果。 根據以下代碼,我無法將返回對象獲取到Web api控制器,因為該對象包含項目但沒有映射屬性。
var result = dbContext.Query<object>().AsNoTracking().FromSql(
"dbo.MY_SP @DateFrom=@DateFrom, @DateTo=@DateTo",
dateFromParam, dateToParam).ToList();
在您的情況下,您需要使用dynamic來表示存儲過程的結果。
在您的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));
請讓我知道這個答案是否有用。
問候。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.