私はあなたの問題を正しく理解することを望みます。 dbo.spGetSomeData
などの既存のストアドプロシージャがあります 、データベース内。これは、いくつかのフィールドを持ついくつかのアイテムのリストを返し、WebAPIメソッドからデータを提供する必要があります。
実装は次のようになります。 空を定義できます 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
{
// 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)
{
...
}
}
これで、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;
// 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;
}
}
}
上記のコードは、exec dbo.spGetSomeData
を使用して実行するだけです。 dataRaderを使用してすべての結果を読み取り、そこにdynamic
に保存します 物体。 $.ajax
を作成する場合 api/My
からの呼び出し dbo.spGetSomeData
から返されたデータを取得します 、JavaScriptコードで直接使用できます。上記のコードは非常に透過的です。 dbo.spGetSomeData
によって返されるデータセットのフィールドの名前 JavaScriptコードのプロパティの名前になります。 C#コードのエンティティクラスを管理する必要はありません。 C#コードには、ストアドプロシージャから返されるフィールドの名前がありません。したがって、dbo.spGetSomeData
のコードを拡張/変更する場合 (一部のフィールドの名前を変更し、新しいフィールドを追加します)JavaScriptコードのみを調整する必要があり、C#コードは調整する必要はありません。