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を使用することは可能ですか?