我们公司的表格是用带填充空格的字段创建的。
我没有访问/权限来更改数据库。
但是,我注意到当我使用Trim()函数创建LINQ查询时,性能会下降很多。
如此简单的查询表明性能下降:
Companies
.Where(c => c.CompanyName.Equals("Apple"))
.Select(c => new {
Tick = c.Ticker.Trim(),
Address = c.Address.Trim()
});
有没有办法更改查询,以免性能下降?
或者仅仅依靠我的DBA?
答案 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.您应该尽量尝试清理数据库而不是修复查询中的错误数据。如果你不能做这份工作,找到合适的人并扭转双臂。