EF6 EntityCommand получает параметры и производительность

В контексте 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 чище?

person Alex    schedule 23.10.2013    source источник
comment
Вы можете создавать динамические запросы linq. Они должны быть кэшированы. См. пример этого в моем блоге: blog.3d-logic.com/2013/03/24/   -  person Pawel    schedule 23.10.2013
comment
Вы можете динамически создавать запросы с помощью PredicateBuilder. Большим преимуществом является то, что у вас нет всех этих неуправляемых строковых литералов.   -  person Gert Arnold    schedule 24.10.2013


Ответы (1)


Используйте LINQ следующим образом:

//define base LINQ
Contracts = from R in AdventureWorks.Customer select R; //there is IQueryable, not actually     materialized

//tune filters, no records will fetched
Result = Contracts;
if (code!=null) Result = Result.Where(_=>_.Code==code);
if (date!=null) Result = Result.Where(_=>_.Date==date);

//materialize records
Records = Result..Select(_=>_.Contract).ToArray();
person softilium    schedule 05.10.2014