Saya harap saya memahami masalah Anda dengan benar. Anda sudah memiliki PROSEDUR TERSIMPAN, misalnya dbo.spGetSomeData
, dalam database, yang mengembalikan daftar beberapa item dengan beberapa bidang dan Anda perlu menyediakan data dari metode Web API.
Implementasinya bisa tentang berikut ini. Anda dapat menentukan kosong DbContext
seperti:
public class MyDbContext : DbContext
{
}
dan untuk mendefinisikan appsettings.json
dengan koneksi string ke database
{
"Data": {
"DefaultConnection": {
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=MyDb;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
}
Anda harus menggunakan Microsoft.Extensions.DependencyInjection
untuk menambahkan MyDbContext
ke
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)
{
...
}
}
Sekarang Anda dapat mengimplementasikan tindakan WebApi Anda sebagai berikut:
[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;
}
}
}
Kode di atas cukup jalankan menggunakan exec dbo.spGetSomeData
dan gunakan dataRader untuk membaca semua hasil dan simpan di sana dalam dynamic
obyek. Jika Anda ingin membuat $.ajax
panggilan dari api/My
anda akan mendapatkan data yang dikembalikan dari dbo.spGetSomeData
, yang dapat langsung Anda gunakan dalam kode JavaScript. Kode di atas sangat transparan. Nama bidang dari kumpulan data yang dikembalikan oleh dbo.spGetSomeData
akan menjadi nama properti dalam kode JavaScript. Anda tidak perlu mengelola kelas entitas apa pun dalam kode C# Anda dengan cara apa pun. Kode C# Anda tidak memiliki nama bidang yang dikembalikan dari prosedur tersimpan. Jadi jika Anda ingin memperpanjang/mengubah kode dbo.spGetSomeData
(ganti nama beberapa bidang, tambahkan bidang baru) Anda hanya perlu menyesuaikan kode JavaScript Anda, tetapi tidak ada kode C#.