EF6 实体命令获取参数和性能

本文关键字:性能 参数 获取 实体 命令 EF6 | 更新日期: 2023-09-27 18:36:32

在 EF6 上下文中,我想按动态字段/属性筛选多个实体。我是 EF 的新手,我的观点被 T-SQL 和存储过程以及动态 SQL 查询严重破坏。

例如,在ERP环境中,用户可以按代码进行过滤,系统应返回:

  • 具有客户 ID = 代码的客户
  • 供应商 ID = 代码的供应商
  • 用户 ID = 代码的用户
  • 具有客户 ID/供应商 ID = 代码的订单
  • 等。

但不仅可以是一个代码,还可以过滤多个概念:一个名字,一个城市,一个日期,...并且可能不适用于所有实体。

因此,

由于每个实体都有不同的属性名称来引用该"代码"概念,因此我认为最好的解决方案是使用 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 做到这一点?

EF6 实体命令获取参数和性能

像这样使用 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();