Tôi hy vọng rằng tôi hiểu đúng vấn đề của bạn. Bạn hiện có THỦ TỤC ĐƯỢC LƯU TRỮ, ví dụ:dbo.spGetSomeData
, trong cơ sở dữ liệu, trả về danh sách một số mục với một số trường và bạn cần cung cấp dữ liệu từ phương thức API Web.
Việc thực hiện có thể là về những điều sau đây. Bạn có thể xác định một trống DbContext
như:
public class MyDbContext : DbContext
{
}
và để xác định appsettings.json
với chuỗi kết nối với cơ sở dữ liệu
{
"Data": {
"DefaultConnection": {
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=MyDb;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
}
Bạn nên sử dụng Microsoft.Extensions.DependencyInjection
để thêm MyDbContext
tới
public class Startup
{
// property for holding configuration
public IConfigurationRoot Configuration { get; set; }
public Startup(IHostingEnvironment env)
{
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
.AddEnvironmentVariables();
// save the configuration in Configuration property
Configuration = builder.Build();
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework 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)
{
...
}
}
Bây giờ bạn có thể triển khai hành động WebApi của mình như sau:
[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;
// set some parameters of the stored procedure
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++) {
// one can modify the next line to
// if (dataReader.IsDBNull(iFiled))
// dataRow.Add(dataReader.GetName(iFiled), dataReader[iFiled]);
// if one want don't fill the property for NULL
// returned from the database
dataRow.Add(
dataReader.GetName(iFiled),
dataReader.IsDBNull(iFiled) ? null : dataReader[iFiled] // use null instead of {}
);
}
retObject.Add((ExpandoObject)dataRow);
}
}
return retObject;
}
}
}
Đoạn mã trên chỉ thực thi bằng cách sử dụng exec dbo.spGetSomeData
và sử dụng dataRader để đọc tất cả kết quả và lưu vào đó trong dynamic
vật. Nếu bạn thực hiện $.ajax
gọi từ api/My
bạn sẽ nhận được dữ liệu trả về từ dbo.spGetSomeData
, mà bạn có thể sử dụng trực tiếp trong mã JavaScript. Đoạn mã trên rất minh bạch. Tên của các trường từ tập dữ liệu được trả về bởi dbo.spGetSomeData
sẽ là tên của các thuộc tính trong mã JavaScript. Bạn không cần quản lý bất kỳ lớp thực thể nào trong mã C # của mình theo bất kỳ cách nào. Mã C # của bạn không có tên các trường được trả về từ quy trình được lưu trữ. Do đó, nếu bạn muốn mở rộng / thay đổi mã của dbo.spGetSomeData
(đổi tên một số trường, thêm các trường mới), bạn sẽ chỉ cần điều chỉnh mã JavaScript của mình chứ không cần điều chỉnh mã C #.