如何提高有关Trim()的Linq查询性能

时间:2013-08-05 03:29:59

标签: c# performance linq linq-to-sql query-performance

我们公司的表格是用带填充空格的字段创建的。

我没有访问/权限来更改数据库。

但是,我注意到当我使用Trim()函数创建LINQ查询时,性能会下降很多。

如此简单的查询表明性能下降:

Companies
.Where(c => c.CompanyName.Equals("Apple"))
.Select(c => new {
  Tick = c.Ticker.Trim(),
  Address = c.Address.Trim()
});

有没有办法更改查询,以免性能下降?

或者仅仅依靠我的DBA?

3 个答案:

答案 0 :(得分:4)

快速解决方案是在将其提供给查询之前填充公司名称。例如,如果列为char(50)

var paddedName = "Apple".PadRight(50);
var result = Companies
 .Where(c => c.CompanyName.Equals(paddedName))
 .Select(c => new {
     Tick = c.Ticker.Trim(),
     Address = c.Address.Trim()
 });

但是,您应该考虑更正数据库以避免进一步的问题。

答案 1 :(得分:0)

如果我们使用“Like”语句进行第一轮过滤,并且使它.ToList(),第二轮只在内部进行相等检查而不调用数据库,我没有尝试性能。

var result = (Companies
            .Where(c => c.CompanyName.StartsWith("Apple"))
            .Select(c => new
            {
                Tick = c.Ticker.Trim(),
                Address = c.Address.Trim()
            })).ToList();

 var result1=result
            .Where(c=>c.CompanyName.Trim().Equals("Apple")) 
            .Select(c => c);

答案 2 :(得分:0)

除了Entity Framework之外,linq-to-sql有时会在遇到无法转换为SQL的方法调用时切换到linq-to-objects。所以,如果你这样做

....
.Select(c => new {
  Tick = c.Ticker.TrimEnd().TrimStart(),
  Address = c.Address.TrimEnd().TrimStart()

您会注意到生成的SQL不再包含LTRIM(RTRIM()),而只包含字段名称以及修剪在客户端内存中执行。显然,LTRIM(RTRIM())会导致查询计划效率降低(令人惊讶)。

如果没有前导空格,也许只有TrimEnd()就足够了。

此外,我完全同意p.s.w.g.您应该尽量尝试清理数据库而不是修复查询中的错误数据。如果你不能做这份工作,找到合适的人并扭转双臂。