C# EF DataContext:代码执行时间太长
我在dataContext中具有以下属性:C# EF DataContext:代码执行时间太长,c#,entity-framework-core,ef-core-2.2,C#,Entity Framework Core,Ef Core 2.2,我在dataContext中具有以下属性: public DbSet<CollectionSite> CollectionSites { get; set; } 所有这些变量如NIDACollections等都是bool?。 这段代码刚刚创建了IQueryable对象,没有执行对源代码的请求,但这段代码正在执行4-5秒(i7,16Gb的RAM)。为什么这么久?我的代码出了什么问题?运行SqlProfiler,如果您将sql server management studio与
public DbSet<CollectionSite> CollectionSites { get; set; }
所有这些变量如NIDACollections
等都是bool?
。
这段代码刚刚创建了
IQueryable
对象,没有执行对源代码的请求,但这段代码正在执行4-5秒(i7,16Gb的RAM)。为什么这么久?我的代码出了什么问题?运行SqlProfiler,如果您将sql server management studio与sql server一起使用,它内置在工具下,如果您使用其他数据库,请尝试从EF上下文记录生成的查询
获取从Linq语句生成的查询,并直接在数据库上运行它,然后分析查询计划。查看导致此查询速度减慢的原因。我的猜测是(由于缺少索引而进行表扫描)。表中有多少行?这些列中有没有索引?选择最有选择性的一个,并在其上放置一个非聚集索引。但是,如果我只是组合查询,那么表中有多少行又有什么关系呢?在我看来,有两件事可能是错误的。正如@Milney所说,您有很多行要处理,或者您对
NIDACollections
,SAPCollections
等使用延迟加载。尝试使用快速加载。只有通过添加.ToList()对其进行迭代,查询才会执行
或在foreach中使用它
将查询创建分解为对Where()
的多个调用。这样,您将发现哪些行执行得很慢。在具有复杂getter的条件下,对象中可能存在属性。另一个选择是如果有Visual Studio Profiler,则使用它。SqlProfiler不显示任何内容,如果它显示任何内容,它会感到惊讶,因为我不调用DB,只需合并一个请求@OlegSh您使用的是数据库集,这表明您正在尝试访问数据库中的数据。当您迭代查询(-results)时,将发生数据库调用。@HansKesting,但我不调用ToList()或其他什么
var query = _context.CollectionSites
.Where(cs =>
cs.IsActive &&
cs.OpenToPublic &&
(NIDACollections == null || cs.NIDACollections == NIDACollections.Value) &&
(SAPCollections == null || cs.SAPCollections == SAPCollections.Value) &&
(observedRequested == null || cs.ObservedCollection == observedRequested.Value) &&
(electronicCC == null || cs.RegulatedElectronicCCF == electronicCC.Value) &&
(alcoholTestType == null || cs.BreathAlcohol == alcoholTestType.Value))
;