В контекст на EF6 искам да филтрирам множество обекти по динамични полета/атрибути. Аз съм нов в EF и моята гледна точка е много повредена от T-SQL и съхранени процедури и динамични SQL заявки.
Например в ERP среда потребителят може да филтрира по код и системата трябва да върне:
- Клиент с CustomerID = код
- Доставчик с SupplierID = код
- Потребител с UserID = код
- Поръчки с CustomerID/SupplierID = код
- и т.н.
Но не може да бъде само код, може да има множество концепции за филтриране: име, град, дата, ... и всички може да не се прилагат за всички обекти.
Така че, тъй като всеки обект има различни имена на атрибути, които да се отнасят до тази концепция за „код“, реших, че най-доброто решение е да се използва EntityCommand вместо LinQ.
И кодът трябва да изглежда нещо като:
// 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 по по-чист начин?