LINQ需要40秒才能结束查询 - 性能

时间:2015-06-17 16:05:12

标签: c# performance linq ef-code-first edmx

我正在调用本地网络之外的外部数据库,但查询需要40秒才能结束..

我正在使用edmx进行通话。

String Example = "Example";
var Result = EDMXEntity.Entities
    .Where(
        x => 
        (
            x.Name.ToString().ToLower().Contains(Example.ToLower())
        ))
    .Take(50)
    .ToList();

感谢Szer的当前代码:

var Result = EDMXEntity.Entities.Where(x => SqlFunctions.PatIndex(x.Name.ToString().ToLower(), Example.ToLower()) > 0).Take(50).ToList();

3 个答案:

答案 0 :(得分:1)

  

sql server management studio在不到一秒的时间内完成它

可能是,这是由错误的缓存查询执行计划引起的,如hereherehere所述。

人们发现针对SQL Server运行以下命令可以解决这个问题。 (可能只需要第二个命令。)

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

答案 1 :(得分:1)

字符串比较的最佳选择是使用不等式,因此您不必处理转换字符串。在这种情况下,名称上的.ToString并非真的有必要我不会想到(然而,我不确定它是如何存储的,因此可能需要它)。同样使用名称,您可以尝试使用相等或至少

最后,您可以尝试将其拆分为Queryable对象,然后以这种方式运行查询。这样,您可以减少用于查询本身的资源数量。

修改

由于不希望检查整个字符串,因此可以使用IndexOf代替不使用完整的字符串

请参阅以下内容:

String Example = "Example";
var EDMXEntity = new List<String>();
var Query = EDMXEntity.Entities.AsQueryable();
var Result = Query
    .Where(
        x => 
        (
            x.Name.ToString().ToLower().Contains(Example.ToLower())
        ))
    .Take(50)
    .ToList();

答案 2 :(得分:1)

上述评论的最后答案:

问题是您正在将所有实体从数据库加载到内存并在您的计算机上进行过滤。您应该在数据库引擎的帮助下过滤您的查询。

为此,您应该使用SqlFunctions映射到LINQ SQL提供程序的直接T-SQL代码。 在您的情况下,您可以将string.Contains()替换为几乎相同的SqlFunctions.PatIndex(它返回int而不是bool

像这样:

var result = EDMXEntity.Entities
   .Where(x => SqlFunctions.PatIndex(
      stringPattern: x.Name.ToString().ToLower(), 
      target:        Example.ToLower()) > 0)
   .Take(50)
   .ToList();