C# 使用C中的LINQ从实体框架中的大表中获取.Count的最快方法

C# 使用C中的LINQ从实体框架中的大表中获取.Count的最快方法,c#,entity-framework,linq,C#,Entity Framework,Linq,我正在使用实体框架和LINQ。我有一张大约有50万条记录的桌子,我想得到一张桌子的计数。最好的方法是什么 我试过这个: // Without WHERE condition. Execution Time = 5864 miliseconds var count = context.MyTable .AsNoTracking() .Count(); // With WHERE condition. Execution

我正在使用实体框架和LINQ。我有一张大约有50万条记录的桌子,我想得到一张桌子的计数。最好的方法是什么

我试过这个:

// Without WHERE condition. Execution Time = 5864 miliseconds
var count = context.MyTable
                   .AsNoTracking()
                   .Count();

// With WHERE condition. Execution Time = 9825 miliseconds
var count = context.MyTable
                   .AsNoTracking()
                   .Count(x => !x.IsDeleted && (x.Column.Contains(keyword) || x.Column2.Contains(keyword) || x.Column3.Contains(keyword))); 

是否有其他方法或途径来改进此查询

直接用底层数据库引擎MSSQL?的本地SQL方言执行查询,并对其进行概要分析。LINQ to实体应该从MyTable创建一个straighforward SELECT COUNT*,其中。。。语句,几乎没有优化的潜力。很明显,WHERE的版本要慢得多,可能IsDeleted是布尔型的,很难通过索引进行改进,并且Contains被转换为LIKE,并且在大多数情况下会在执行计划中提供完整的表扫描。查询的执行计划是什么?这些列有索引吗?当您直接对数据库执行查询时,需要花费多少时间?顺便说一句,这里的AsNoTracking调用是多余的。顺便说一句,x.Column.Containskeyword是邪恶的。它映射到类似“%keyword%”的列,该列不能使用索引,除非使用全文搜索。此查询被迫使用IsDeleted标志扫描所有内容,而无需编制索引。如果确实要执行这种开放式查询,请使用fts如果您说SQL中的同一查询是quick-log,该查询是由EF使用context.Database.log=Console.WriteLine或类似命令生成的,并查看它是否符合您的预期。如果您告诉我们您实际使用的数据库,也不会有什么坏处。