web-dev-qa-db-ja.com

エンティティフレームワークを使用してストアドプロシージャを実行する

内部結合と左外部結合を使用して2つ以上のテーブルからデータベースからレコードを選択するEFを使用してストアドプロシージャを実行することは可能ですか?.

私の見解は、EFまたはLINQで結合を行う方法を回避することです。これは多くの問題があります。

したがって、そのプロシージャを作成する場合、ユーザー入力からパラメーターを指定して呼び出し、その結果を.ToList()メソッドに割り当てて、結果をasp:repeater .DataSourceに追加できます。

奇妙な質問かもしれませんが、私は多くの理由で最初にこれをやりたいと思っています。EFを使用する方が快適だからです。次に、EFで結合を使用しないようにします。 3番目に、クエリを頻繁に呼び出す場合にストアドプロシージャを使用するとクエリのパフォーマンスが向上することをどこかで読みました。

誰かが例を挙げてこれらの質問に答えるのを手伝ってくれるなら、私は感謝します。

7
Fares Ayyad

Entity FrameworkデータコンテキストからSqlQueryを呼び出すことができます。

context.Database.SqlQuery<YourType>("exec usp_StoredProcedure").ToList()

例として、クエリ結果をマップするクラスが必要になります。

public class YourType
{
   public string Property1 { get; set; }
   public string Property2 { get; set; }
}

以下に示すように、クエリにパラメータを指定することもできます。

SqlParameter parameter1 = new SqlParameter("@Parameter1", "Value");
context.Database.SqlQuery<YourType>("exec usp_StoredProcedure @Parameter1", parameter1).ToList()
20
Darren

MySQLでEntity Frameworkを使用している場合:

この例では、ストアドプロシージャはmyParamという名前のタイプ[〜#〜] bigint [〜#〜]

var myParam = new SqlParameter("@myParam", (MySqlDbType.Int64)).Value = 100;

var res = _context.Database.SqlQuery<MyEntity>($"call MyProcedureName({pyParam})");

クエリ文字列を作成するために C#文字列補間 を使用していることに注意してください。

0
Hooman Bahreini

Entity Frameworkでストアドプロシージャを実行する方法を確認します。MVCでは、EFを追加する方法を確認します。

データベースで次のスクリプトを実行して、ストアドプロシージャを作成します。

CREATE PROCEDURE FETCHEMPLOYEES AS
BEGIN
    SELECT * FROM EMPTABLE
END

CREATE PROCEDURE FETCHEMPLOYEE(@ID INT) AS
BEGIN
  SELECT * FROM EMPTABLE WHERE ID = @ID
END



public class EmpModel
{
    EmployeeEntities empdb = new EmployeeEntities();

    public List<EMPTABLE> GetEmployees()
    {
       return empdb.FETCHEMPLOYEES().ToList();  
    }

    public EMPTABLE GetEmployee(int? id)
    {
        return empdb.FETCHEMPLOYEE(id).ToList().Single();
    }
}

public class EmployeeController : Controller
{
    Models.EmpModel mod = new Models.EmpModel();

    public ActionResult Index()
    {
        List<EMPTABLE> result = mod.GetEmployees();
        return View(result);
    }

    public ActionResult Details(int id)
    {
        EMPTABLE result = mod.GetEmployee(id);
        return View(result);
    }
}

詳細な手順については、次のリンクを参照してください。 http://dotnetvisio.blogspot.in/2014/01/execute-stored-procedure-using-entity.html

0
Rajesh G

ExecuteFunctionクラスのObjectContextを使用できます:

 public virtual ObjectResult<CustomClassForStoreReturnedData> NameOfStoredProcedure(Nullable<int> tableID)
    {
        var IDParameter = tableID.HasValue ?
            new ObjectParameter("tableID", tableID) :
            new ObjectParameter("tableID", typeof(int));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<CustomClassForStoreReturnedData>("NameOfStoredProcedureInSQLDatabase", IDParameter);
    }
0
AminM