Geo*_*rge 3 sql-server rest stored-procedures entity-framework-core .net-core
我想从返回 3 个不同表的 SQL Server 存储过程加载 3 个不同的模型,例如:
select A.id, A.Name from tableA A
select B.id, B.Age from tableB B
select C.Test, C.Param from tableC C
Run Code Online (Sandbox Code Playgroud)
通常,我会使用 Entity Framework Core 处理单个结果存储过程,如下所示:
语境:
public virtual DbQuery<StoredProcedureModel> spModel{ get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Query<StoredProcedureModel>(entity =>
{
entity.Property(e => e.Id)
.HasColumnName("Id");
entity.Property(e => e.Name)
.HasColumnName("Name");
}
}
Run Code Online (Sandbox Code Playgroud)
存储库:
return _context.StoredProcedureModel
.FromSql<StoredProcedureModel>(
"GET_ID_NAME @ID,@NAME",
new SqlParameter("@ID", ID),
new SqlParameter("@NAME", Name))
.ToList();
Run Code Online (Sandbox Code Playgroud)
这只是一个虚拟示例,但我想知道是否有一种方法可以将所有 3 个表加载到 3 个不同的模型中(某些返回的表具有相同的列名称,如“id”)。
目前,Entitiy-Framework 无法实现这一点,但有一个FeatureRequest。作为解决方法,根据这篇博客文章,有一个使用 ADO.Net 的解决方案:
首先对你的类进行编码:
public class TableA
{
public int Id { get; set; }
public string Name { get; set; }
}
public class TableB
{
public int Id { get; set; }
public int Age { get; set; }
}
public class TableC
{
public string Test { get; set; }
public string Param { get; set; }
}
public class StoredProcedureResult
{
public List<TableA> TableAEntries { get; set; }
public List<TableB> TableBEntries { get; set; }
public List<TableC> TableCEntries { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后将以下函数编码到您的 CustomDbContext 类中:
public async Task<StoredProcedureResult> GetStoredProcedureResult(int id, string name)
{
var connection = Database.GetDbConnection();
await connection.OpenAsync();
var command = connection.CreateCommand();
command.CommandText = "GET_ID_NAME @ID, @NAME";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new Microsoft.Data.SqlClient.SqlParameter("@ID", id));
command.Parameters.Add(new Microsoft.Data.SqlClient.SqlParameter("@NAME", name));
var reader = await command.ExecuteReaderAsync();
var tableAEntries = new List<TableA>();
var tableBEntries = new List<TableB>();
var tableCEntries = new List<TableC>();
while (await reader.ReadAsync())
{
tableAEntries.Add(new TableA
{
Id = reader.GetInt32("id"),
Name = reader.GetString("name"),
});
}
await reader.NextResultAsync();
while (await reader.ReadAsync())
{
tableBEntries.Add(new TableB
{
Id = reader.GetInt32("id"),
Age = reader.GetInt32("Age"),
});
}
await reader.NextResultAsync();
while (await reader.ReadAsync())
{
tableCEntries.Add(new TableC
{
Test = reader.GetString("Test"),
Param = reader.GetString("Param"),
});
}
var storedProcedureResult = new StoredProcedureResult();
storedProcedureResult.TableAEntries = tableAEntries;
storedProcedureResult.TableBEntries = tableBEntries;
storedProcedureResult.TableCEntries = tableCEntries;
await reader.CloseAsync();
return storedProcedureResult;
}
Run Code Online (Sandbox Code Playgroud)