希望我正确理解了您的问题。您在数据库中有一个现有的存储过程,例如dbo.spGetSomeData
,它返回一些项目的列表以及一些字段,并且您需要提供来自Web API方法的数据。
实现可能涉及以下内容。您可以定义一个空DbContext
,如下:
public class MyDbContext : DbContext
{
}
定义 appsettings.json
中的连接字符串以连接到数据库。
{
"Data": {
"DefaultConnection": {
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=MyDb;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
}
您应该使用
Microsoft.Extensions.DependencyInjection
将
MyDbContext
添加到中。
public class Startup
{
public IConfigurationRoot Configuration { get; set; }
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<MyDbContext>(options => {
options.UseSqlServer(Configuration["ConnectionString"]);
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
}
}
现在,您可以将WebApi操作实现为以下内容:
[Route("api/[controller]")]
public class MyController : Controller
{
public MyDbContext _context { get; set; }
public MyController([FromServices] MyDbContext context)
{
_context = context;
}
[HttpGet]
public async IEnumerable<object> Get()
{
var returnObject = new List<dynamic>();
using (var cmd = _context.Database.GetDbConnection().CreateCommand()) {
cmd.CommandText = "exec dbo.spGetSomeData";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@someParam",
SqlDbType.TinyInt) { Value = 1 });
if (cmd.Connection.State != ConnectionState.Open)
cmd.Connection.Open();
var retObject = new List<dynamic>();
using (var dataReader = await cmd.ExecuteReaderAsync())
{
while (await dataReader.ReadAsync())
{
var dataRow = new ExpandoObject() as IDictionary<string, object>;
for (var iFiled = 0; iFiled < dataReader.FieldCount; iFiled++) {
dataRow.Add(
dataReader.GetName(iFiled),
dataReader.IsDBNull(iFiled) ? null : dataReader[iFiled]
);
}
retObject.Add((ExpandoObject)dataRow);
}
}
return retObject;
}
}
}
上面的代码只需使用
exec dbo.spGetSomeData
执行,并使用 dataRader 读取所有结果并保存在
dynamic
对象中。如果您从
api/My
进行
$.ajax
调用,则将返回从
dbo.spGetSomeData
中返回的数据,您可以直接在 JavaScript 代码中使用它。上述代码非常透明。由
dbo.spGetSomeData
返回的数据集中的字段名称将成为 JavaScript 代码中属性的名称。
您不需要以任何方式在 C#代码中管理任何实体类。您的 C# 代码没有从存储过程返回的字段名称。因此,如果您扩展/更改 dbo.spGetSomeData
的代码(重命名某些字段,添加新字段),则只需调整您的 JavaScript 代码,而无需调整 C# 代码。