Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何优化在500000个表上花费11分钟的EntityFramework查询_C#_Sql Server_Entity Framework_Linq - Fatal编程技术网

C# 如何优化在500000个表上花费11分钟的EntityFramework查询

C# 如何优化在500000个表上花费11分钟的EntityFramework查询,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,我有一个有500000条记录的表,在我的应用程序中,我做了一些筛选,查询返回410000条记录,现在不要误会,我不会在屏幕上显示这些数据,这是一个财务应用程序,每天都需要处理该表,在内存中进行一些计算,并将一些总数写回其他表 我不想粘贴我的整个模型,因为它不符合这个问题的目的,问题是如何优化EF以加快查询速度,我尝试使用SQL配置文件并返回410000个,这需要11分钟 private List<MasterVenta> FilterMasterVentas(RuleEditor f

我有一个有500000条记录的表,在我的应用程序中,我做了一些筛选,查询返回410000条记录,现在不要误会,我不会在屏幕上显示这些数据,这是一个财务应用程序,每天都需要处理该表,在内存中进行一些计算,并将一些总数写回其他表

我不想粘贴我的整个模型,因为它不符合这个问题的目的,问题是如何优化EF以加快查询速度,我尝试使用SQL配置文件并返回410000个,这需要11分钟

private List<MasterVenta> FilterMasterVentas(RuleEditor filter, ComisionPorProveedor comisionPorProveedor)
        {
            Periodo periodo = comisionPorProveedor.Periodo;
            var strReferences = new StringBuilder();
            var Modelo_PuntoVentaProveedor = nameof(MasterVenta.PuntoVentaProveedor);
            var Modelo_PuntoVentaProveedor_proveedor = Modelo_PuntoVentaProveedor + "." + nameof(PuntosVentaProveedor.Proveedor);
            var Modelo_PuntoVentaProveedor_Liquidaciones = Modelo_PuntoVentaProveedor + "." + nameof(PuntosVentaProveedor.Liquidaciones);
            var Modelo_PuntoVentaProveedor_Proveedor_TipoDeCanal = Modelo_PuntoVentaProveedor_proveedor + "." + nameof(Proveedor.TipoDeCanal);
            //var Modelo_PuntoVentaProveedor_Proveedor_Productos = Modelo_PuntoVentaProveedor_proveedor + "." + nameof(Proveedor.Productos);
            var Modelo_PuntoVentaProveedor_Proveedor_ContactosProveedor = Modelo_PuntoVentaProveedor_proveedor + "." + nameof(Proveedor.ContactosProveedor);
            var Modelo_PuntoVentaProveedor_Proveedor_Contrato = Modelo_PuntoVentaProveedor_proveedor + "." + nameof(Proveedor.Contrato);
            var Modelo_PuntoVentaProveedor_Proveedor_ComisionesPorProveedor = Modelo_PuntoVentaProveedor_proveedor + "." + nameof(Proveedor.ComisionesPorProveedor);


            strReferences.Append(Modelo_PuntoVentaProveedor);
            strReferences.Append("," + Modelo_PuntoVentaProveedor_Liquidaciones);
            strReferences.Append("," + Modelo_PuntoVentaProveedor_Proveedor_TipoDeCanal);
            //strReferences.Append("," + Modelo_PuntoVentaProveedor_Proveedor_Productos);
            strReferences.Append("," + Modelo_PuntoVentaProveedor_Proveedor_ContactosProveedor);
            strReferences.Append("," + Modelo_PuntoVentaProveedor_Proveedor_Contrato);
            strReferences.Append("," + Modelo_PuntoVentaProveedor_Proveedor_ComisionesPorProveedor);

            //el master de ventas debe filtrase por el periodo, PuntoVenta, TipoDeCanal,Producto

            List<int> puntosVenta = comisionPorProveedor.Proveedor.PuntosVentaProveedor.Select(p => p.PuntoVentaProveedorId).ToList();//tipo de canal de proveedor de acuerdo a la tabla comisionPorProveedor



            if (filter.Rule.IsEmpty()) return null;
            if (!filter.Rule.IsValid()) return null;
            var q = (from c in this.unitOfWork.MasterVentaRepository.Get(null, o => o.OrderBy(x => x.MasterVentaID), strReferences.ToString()).Filter<MasterVenta>(filter.Rule.GetRuleXml())
                     where c.FechaVenta != null &&
                     (
                      (DateTime.Compare(c.FechaVenta.Value, periodo.FechaFinal) <= 0)
                      && (DateTime.Compare(c.FechaVenta.Value, periodo.FechaInicial) >= 0)
                     )
                     &&
                     (c.PuntoVentaProveedor != null &&
                     (
                     (puntosVenta.Any(pv => c.PuntoVentaProveedor != null && pv == c.PuntoVentaProveedor.PuntoVentaProveedorId)
                     || c.PuntoVentaProveedor.PuntoDeVentaHistorials.Any(p => c.PuntoVentaProveedor != null && c.FechaVenta >= p.FechaInicio && c.FechaVenta <= p.FechaFin))


                     ))

                     select c);
            var result = q.ToList();
            return result;


        }
private List FilterMasterVentas(规则编辑器过滤器,CommisionPorProveeder或CommisionPorProveeder)
{
Periodo Periodo=委员会批准人Periodo;
var strReferences=新的StringBuilder();
var Modelo_puntoventaproveredor=名称(MasterVenta.puntoventaproveredor);
var Modelo_Puntoventaproveredor_proveedor=Modelo_Puntoventaproveredor+“”+名称(Puntoventaproveredor.proveedor);
var Modelo_puntoventaproveredor_Liquidaciones=Modelo_puntoventaproveredor+“”+名称(puntoventaproveredor.Liquidaciones);
var Modelo_puntoventaproveredor_Proveedor_TipoDeCanal=Modelo_puntoventaproveredor_Proveedor+“”+名称(Proveedor.TipoDeCanal);
//var Modelo_Puntoventaproveredor_Proveedor_Productos=Modelo_Puntoventaproveredor_Proveedor+“”+名称(Proveedor.Productos);
var Modelo_puntoventaproveredor\u provider\u contactosprovider=Modelo_puntoventaproveredor\u provider+“”+名称(provider.contactosprovider);
var Modelo_Puntoventaproveredor_Proveedor_Contrato=Modelo_Puntoventaproveredor_Proveedor+“”+名称(Proveedor.Contrato);
var Modelo_Puntoventaproveredor_Proveredor_CommisionsPorproveredor=Modelo_Puntoventaproveredor_Proveredor+“+”+名称(Proveedor.CommisionsPorproveredor);
附加(Modelo_Puntoventaproveredor);
附加(“,”+Modelo\u puntoventaproveredor\u Liquidaciones);
附加(“,”+Modelo\u puntoventaproveredor\u provider\u TipoDeCanal);
//附加(“,”+Modelo\u puntoventaproveredor\u provider\u Productos);
附加(“,”+Modelo\u puntoventaprover\u provider\u contact-sprover);
附加(“,”+Modelo\u puntoventaproveredor\u provider\u contato);
标准参考。附加(“,”+Modelo\u puntoventaprover\u provider\u commissionesporprover);
//周期性过滤设备、PuntoVenta、TipoDeCanal、Producto
列出puntosVenta=commisionporproveedor.provedor.puntosventaprovedor.Select(p=>p.puntosventaprovedorid.ToList();//在一个表中列出一个委员会provedor
if(filter.Rule.IsEmpty())返回null;
如果(!filter.Rule.IsValid())返回null;
var q=(此.unitOfWork.MasterVentaRepository.Get中的c为空,o=>o.OrderBy(x=>x.MasterVentaID),strReferences.ToString()).Filter(Filter.Rule.GetRuleXml())
其中c.FechaVenta!=null&&
(
(DateTime.Compare(c.FechaVenta.Value,periodo.FechaFinal)=0)
)
&&
(c.puntoventaproveredor!=null&&
(
(puntoventa.Any(pv=>c.puntoventaproveredor!=null&&pv==c.puntoventaproveredor.puntoventaproveredorid)
||c.puntoventaproveredor.puntoventahistorials.Any(p=>c.puntoventaproveredor!=null&&c.FechaVenta>=p.FechaInicio&&c.FechaVenta o.OrderBy(x=>x.MasterVentaID),strReferences.ToString()).Filter(Filter.Rule.GetRuleXml())
其中c.FechaVenta!=null&&
(
(DateTime.Compare(c.FechaVenta.Value,periodo.FechaFinal)=0)
)
&&
(c.puntoventaproveredor!=null&&
(
(puntoventa.Any(pv=>c.puntoventaproveredor!=null&&pv==c.puntoventaproveredor.puntoventaproveredorid)

||c.puntoventaproveredor.puntoventahistorials.Any(p=>c.puntoventaproveredor!=null&&c.FechaVenta>=p.FechaInicio&&c.FechaVenta通常,延迟是由网络延迟和传输数据量所需的时间引起的。您希望将传输的数据量降至最低,因此有两种方法:

  • 创建一个轻量级对象,该对象映射到表,并且只返回绝对需要的表中的列
  • 是否可以聚合SQL Server上的任何数据,并返回聚合后的数据用于计算

  • Entity Framework公开了许多性能优化选项,以帮助您优化应用程序的性能。其中一个优化选项是.AsNoTracking()。此优化允许您告诉Entity Framework不要跟踪查询结果。这意味着Entity Framework不会对查询返回的实体执行其他处理或存储。但是,这也意味着您不能在不将这些实体重新附加到跟踪图的情况下更新这些实体

    来源

    这将大大提高性能。
    您可以从生成的SQL中检查更多的调整。但是,始终会有一个点,您必须转到DB来优化它,如切分、索引等。问题是,这不是LinqToEntityFramework查询。这是LinqToObject查询

    您的linq到EntityFramework查询在这里

    List<int> puntosVenta = comisionPorProveedor.Proveedor.PuntosVentaProveedor.Select(p => p.PuntoVentaProveedorId).ToList();//tipo de canal de proveedor de acuerdo a la tabla comisionPorProveedor
    
    this.unitOfWork.MasterVentaRepository.Get(null, o => o.OrderBy(x => x.MasterVentaID), strReferences.ToString())
    
    List puntoventa=commisionporproveedor.provedor.puntoventaproveredor.Select(p=>p.puntoventaproveredorid.ToList();///tipo de canal de provedor de acuerdo la tabla commisionporproveredor
    this.unitOfWork.MasterVentaRepository.Get(null,o=>o.Orde
    
    public virtual IEnumerable<TEntity> Get(
            Expression<Func<TEntity, bool>> filter = null,
            Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
            string includeProperties = "")
        {
          IQueryable<TEntity> query = dbSet.AsNoTracking();
    
          if (filter != null)
          {
            query = query.Where(filter);
          }
    
          foreach (var includeProperty in includeProperties.Split
              (new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
          {
            query = query.Include(includeProperty);
          }
    
    List<int> puntosVenta = comisionPorProveedor.Proveedor.PuntosVentaProveedor.Select(p => p.PuntoVentaProveedorId).ToList();//tipo de canal de proveedor de acuerdo a la tabla comisionPorProveedor
    
    this.unitOfWork.MasterVentaRepository.Get(null, o => o.OrderBy(x => x.MasterVentaID), strReferences.ToString())