Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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# 实体框架DbContext筛选的count查询使用变量时速度非常慢_C#_Entity Framework 6_Query Optimization - Fatal编程技术网

C# 实体框架DbContext筛选的count查询使用变量时速度非常慢

C# 实体框架DbContext筛选的count查询使用变量时速度非常慢,c#,entity-framework-6,query-optimization,C#,Entity Framework 6,Query Optimization,使用ADO.NET实体数据模型,我在下面针对一个包含1800条记录的表构造了两个查询,该表有30多个字段,产生了惊人的结果 // Executes slowly, over 6000 ms int count = context.viewCustomers.AsNoTracking() .Where(c => c.Cust_ID == _custID).Count(); // Executes instantly, under 20 ms int c

使用ADO.NET实体数据模型,我在下面针对一个包含1800条记录的表构造了两个查询,该表有30多个字段,产生了惊人的结果

// Executes slowly, over 6000 ms
int count = context.viewCustomers.AsNoTracking()
                   .Where(c => c.Cust_ID == _custID).Count();

// Executes instantly, under 20 ms
int count = context.viewCustomers.AsNoTracking()
                   .Where(c => c.Cust_ID == 625).Count();
我从数据库日志中看到,Entity Framework提供的查询几乎相同,只是过滤器部分使用了一个参数。将此查询复制到SSMS中并在其中声明和设置此参数将导致一个近乎即时的查询,这样它就不会出现在数据库端

有没有人遇到过这种情况,可以解释发生了什么?我受第三方控件的摆布,该控件将此命令添加到查询中,试图限制返回的行数,必须获取计数。这用于多个查询,因此需要通用解决方案。不幸的是,它没有像广告中所说的那样工作,它似乎只会使查询花费5-10倍的时间,如果我只是将整个视图加载到内存中。然而,当没有使用过滤器时,它就像做梦一样工作


这些组件的使用包括源代码,所以我可以改变这种行为,但需要考虑哪些方法可以用来提供可重用的解决方案。

< P>您没有提及模型的设计细节,但是如果您只想基于条件来记录记录,然后,可以通过仅基于一列计算结果集来优化此操作。比如说,

    int count = context.viewCustomers.AsNoTracking().Where(c => c.Cust_ID == _custID).Count();
如果您的设计有10列,并且基于上述语句,假设返回了100条记录,那么针对每个记录,结果集包含10列不可用的数据

您可以通过仅计算基于单个列的结果集来优化此设置

   int count = context.viewCustomers.AsNoTracking().Where(c => c.Cust_ID == _custID).Select(x=>new {x.column}).Count();

还可以使用其他优化方法,例如使用异步计数变量。

我猜您的表在
Cust\u ID
列上没有
Index
。也许你可以检查一下再确认一下。