EFでは、マップされたエンティティまたは変換されたエンティティを返す代わりに、従来のADO.netのようにRaw DataTable/DataSetを返すためにストアドプロシージャを使用できますか?Entity Framework:生のテーブル結果を返すためにストアドプロシージャを使用する
1
A
答えて
1
EFはADO.NET上に構築されているため、必要なときにDbContextに直接アクセスしてDbContextを直接使用できます。例:
using (var db = new MyDbContext())
{
db.Database.Connection.Open();
var con = (SqlConnection)db.Database.Connection;
var cmd = new SqlCommand("exec MyProc", con);
DataTable dt = new DataTable();
using (var rdr = cmd.ExecuteReader())
{
dt.Load(rdr);
}
//. . .
0
はい可能です。
私はこれをどのようにして記述しました。ストアドプロシージャは、データベースの一部です。したがって、データベースにアクセスするクラスにストアド・プロシージャを追加し、データベース・モデルdbContextを作成することをお薦めします。
public class MyDbContext : DbContext
{
// TODO: add DbSet properties
#region stored procedures
// TODO (1): add a function that calls the stored procedure
// TODO (2): add a function to check if the stored procedure exists
// TODO (3): add a function that creates the stored procedure
// TODO (4): make sure the stored procedure is created when the database is created
#endregion stored procedure
}
TODO(1):ストアドプロシージャを呼び出す手順:ストアドプロシージャは、TODO(3
// returns true if MyStoredProcedure exists
public bool MyStoredProcedureExists()
{
return this.ProcedureExists(MyStoredProcedureName);
}
// returns true if stored procedure with procedureName exists
public bool StoredProcedureExists(string procedureName)
{
object[] functionParameters = new object[]
{
new SqlParameter(@"procedurename", procedureName),
};
string query = @"select [name] from sys.procedures where name= @procedurename";
return this.Database.SqlQuery<string>(query, functionParameters)
.AsEnumerable() // bring to local memory
.Where(item => item == procedureName) // take only the procedures with desired name
.Any(); // true if there is such a procedure
}
が存在する場合
private const string MyStoredProcedureName = ...;
private const string myParamName1 = ...;
private const string myParamName2 = ...;
public void CallMyStoredProcedure(MyParameters parameters)
{
object[] functionParameters = new object[]
{
new SqlParameter(myParamName1, parameters.GetParam1Value(),
new SqlParameter(myParamName2, parameters.GetParam2Value(),
... // if needed add more parameters
};
const string sqlCommand = @"Exec " + MyStoredProcedureName
+ " @" + myParamName1
+ ", @" + myParamName2
... // if needed add more parameters
;
this.Database.ExecutSqlCommand(sqlComman, functionParameters);
}
TODO(2)チェック)ストアドプロシージャを作成します。
public void CreateProcedureUpdateUsageCosts(bool forceRecreate)
{
bool storedProcedureExists = this.MyStoredProcedureExists();
// only create (or update) if not exists or if forceRecreate:
if (!storedProcedureExists || forceRecreate)
{ // create or alter:
Debug.WriteLine("Create stored procedures");
// use a StringBuilder to create the SQL command that will create the
// stored procedure
var x = new StringBuilder();
// ALTER or CREATE?
if (!storedProcedureExists)
{
x.Append(@"CREATE");
}
else
{
x.Append(@"ALTER");
}
// procedure name:
x.Append(@" procedure ");
x.AppendLine(MyStoredProcedureName);
// parameters: (only as an example)
x.AppendLine(@"@ReportPeriod int,");
x.AppendLine(@"@CustomerContractId bigint,");
x.AppendLine(@"@CallType nvarChar(80),");
// etc.
// code
x.AppendLine(@"as");
x.AppendLine(@"begin");
// only as example some of my procedure
x.AppendLine(@"Merge [usagecosts]");
x.AppendLine(@"Using (Select @ReportPeriod as reportperiod,");
x.AppendLine(@" @CustomerContractId as customercontractId,");
...
x.AppendLine(@"end");
// execute the created SQL command
this.Database.ExecuteSqlCommand(x.ToString());
}
}
TODO(4)データベースがMyDbContextで
に作成されたときに、ストアドプロシージャが作成されていることを確認します
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// TODO: if needed add fluent Api to build model
// create stored procedure
this.CreateProcedureUpdateUsageCosts(true);
}
用途:
using (var dbContext = new MyDbContext(...))
{
MyParameters parms = FillMyParameters();
dbContext.CallMyStoredProcedure(parms);
}
関連する問題
- 1. Entity Frameworkのストアドプロシージャの最終結果を返します
- 2. Entity Frameworkストアドプロシージャの結果のマッピング
- 3. Entity Framework 7ストアドプロシージャの結果モデル
- 4. ストアドプロシージャでもEntity Frameworkコアで同じ結果が返される
- 5. テーブルを生成するためにEntity Frameworkを取得する
- 6. Entity Frameworkのストアドプロシージャ一時テーブルを返す問題
- 7. Entity Framework、ストアドプロシージャ、複数の一時テーブルを返すか?
- 8. Entity Framework 4 - Guidを返すストアドプロシージャ
- 9. クエリが間違った結果セットを返します - Entity Framework
- 10. Entity Framework 6が複雑なストアドプロシージャのために間違った型を返す
- 11. Entity Frameworkを使用してデータベースから結果を返します
- 12. Entity Framework - プライマリキーのないエンティティとしてのストアドプロシージャの結果
- 13. Entity FrameworkがAsNoTrackingで異なる結果を返す
- 14. Entity Frameworkは、ストアドプロシージャの複数の結果セット(結合テーブルのそれぞれ)を処理できますか?
- 15. Entity Frameworkの - グラブストアドプロシージャの結果
- 16. Entity Frameworkの結果をJSONとして返します
- 17. 複数の結果セットを返すためのOracleクエリ/ストアドプロシージャ
- 18. Entity Framework 4を使用してストアドプロシージャの「結果」、「メッセージ」、および「戻り値」にアクセスする方法は?
- 19. MVC 5&Entity Framework 6のストアドプロシージャを最初に使用する
- 20. Entity Frameworkで使用中のストアドプロシージャのデバッグ
- 21. Entity Framework 5 SQLストアドプロシージャ単一結果効率vb.net
- 22. Entity Frameworkクエリ結果重複
- 23. レコードを挿入するために使用されているSELECTステートメントにストアドプロシージャの結果を返す方法
- 24. Entity Frameworkコードファースト&ストアドプロシージャ
- 25. ストアドプロシージャを使用したEntity Frameworkデータベースの最初のアプローチ
- 26. ストアドプロシージャを使用したEntity Frameworkデータベースの最初のアプローチ
- 27. Entity Frameworkのみストアドプロシージャ
- 28. ストアドプロシージャとEntity Frameworkの
- 29. 結果に複数のテーブルを含むストアドプロシージャを使用したSilverlight LOBアプリケーション
- 30. C#+ Entity Framework +ストアドプロシージャを使用した動的クエリの作成