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

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

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