0

EF6 コンテキストでは、複数のエンティティを動的フィールド/属性でフィルター処理したいと考えています。私は EF を初めて使用し、T-SQL、ストアド プロシージャ、および動的 SQL クエリによって、私の視点が非常に損なわれています。

たとえば、ERP 環境では、ユーザーがコードでフィルタリングすると、システムは次の情報を返す必要があります。

  • CustomerID = コードの顧客
  • SupplierID = コードのサプライヤー
  • UserID = コードのユーザー
  • CustomerID/SupplierID = code の注文

ただし、コードだけでなく、名前、都市、日付などの複数の概念をフィルタリングすることもできます。また、すべてのエンティティにすべてが適用されるとは限りません。

各エンティティには、その「コード」の概念を参照するための異なる属性名があるため、LinQ の代わりに EntityCommand を使用するのが最善の解決策であると考えました。

コードは次のようになります。

// Create a query that takes two parameters.
string eSqlCustomerQuery =
    @"SELECT VALUE Contact FROM AdventureWorksEntities.Customer AS Customer";
string eSqlCustomerQuery =
    @"SELECT VALUE Contact FROM AdventureWorksEntities.Customer AS Customer";
// Create a list of parameters
var param = new SortedList<string, EntityParameter>();

// for each clauses add a pamater and build the query command dynamically.
if(!code)
{
    eSqlCustomerQuery += "WHERE Customer.CustomerID = @CODE";
    eSqlSupplierQuery += "WHERE Supplier.SupplierID = @CODE";
    //... more entities to 
    param["CODE"].ParameterName = "CODE";
    param["CODE"].Value = code;
}
// more parameters here...

using (EntityConnection conn =
    new EntityConnection("name=AdventureWorksEntities"))
{
    conn.Open();
    using (EntityCommand cmd = new EntityCommand(eSqlCustomerQuery, conn))
    {
        cmd.Parameters.Add(param["CODE"]);
        cmd.Parameters.Add(param["DATE"]);
        // more parameters here...
    }
    // the same for each query...
    // ...
    // run all the queries ...
    // ...
    // Etc.
    conn.Close();
}

私の質問は3です:

  • 私がやっているときに、のcmd = new EntityCommand(eSqlCustomerQuery, conn)ようなものを使用できますSystem.Data.SqlClient.SqlCommandBuilder.DeriveParameters(cmd);か?
  • この動的クエリは非常に動的であるため、キャッシュしたり、再利用可能な実行プランを持つことができますが、どのように改善できますか?
  • よりクリーンな方法でLinQを使用することは可能ですか?
4

1 に答える 1