В контексте EF6 я хочу фильтровать несколько объектов по динамическим полям/атрибутам. Я новичок в EF, и моя точка зрения сильно искажена T-SQL, хранимыми процедурами и динамическими SQL-запросами.
Например, в среде ERP пользователь может фильтровать по коду, и система должна возвращать:
- Клиент с идентификатором клиента = код
- Поставщик с 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 чище?