如何改进 Linq-To-Sql 代码
Posted
技术标签:
【中文标题】如何改进 Linq-To-Sql 代码【英文标题】:How to improve Linq-To-Sql code 【发布时间】:2013-04-25 12:19:13 【问题描述】:使用StackExchange.Profiling.MiniProfiler
类来分析一个将 Linq-To-Sql 用作 ORM 的 ASP.NET MVC 应用程序。
我正在尝试将一项操作减少为一个 SQL,以便不再有任何重复项。 所以我相应地更改了我的 linq-to-sql 代码,但它对速度没有任何积极影响。
然后我检查了 SQL 所需的时间。
这显示了 MiniProfiler:
当我在 Management Studio 中启动完全相同的 SQL 时,速度非常快:
代码如下:
from t in type
let tDoc = (from d in context.documents
where d.Key == t.No
&& d.RType == (int)RType.Art
&& d.AType == (int)AType.Doc
select d).FirstOrDefault(d => d.UseForThumb)
select new Time
Id = t.Id,
//... more simple mappings here
// then a complex one:
DocsCount = context.documents.Count(d =>
(d.Key == t.Id.ToString()
&& d.RType == (int)RType.Type
&& d.AType == (int)AType.Doc)
||
(d.Key == t.No
&& d.RType == (int)RType.Art
&& d.AType == (int)AType.Doc)),
// and another one
ThumbId = (tDoc != null && tDoc.FRKey.HasValue) ? tDoc.FRKey.Value : 0
;
造成巨大差异的原因是什么? - 编辑:没有区别,我只是误解了 SSMS :(
无论如何,我的问题仍然存在。我可以进行哪些更改以使其更快?
我有时读到 Linq-To-Sql 的映射存在性能问题。有没有办法解决这个问题?
【问题讨论】:
您的代码和 SSMS 中的性能相同:1 秒,不是吗? 哦,是这样吗?我虽然在 SSMS 中是 1 毫秒!尴尬!获取这 12 行仍然很慢...... 使用 fdottrace 找出发生了什么,停止猜测! 我用Sql Server Profiler在SqlServer上开始了trace,得到了很多信息,但是我还不知道怎么处理……所以我现在边做边学.我也会尝试 fdottrace。 你的问题不在于 sql server,使用 dottrace 找出你的代码的哪一部分是慢的:模板、sql、计算... 【参考方案1】:我做了一些试验和错误,并将 Linq-To-Sql 代码更改为:
from t in types
let docs = context.documents.Where(d => (d.RKey == t.Id.ToString()
&& d.RType == (int)RType.Type
&& d.AType == (int)AType.Doc)
||
(d.RKey == t.No
&& d.RType == (int)RType.Art
&& d.AType == (int)AType.Doc))
let tDoc = docs.FirstOrDefault(d => d.RType == (int)RType.Art && d.UseForThumb)
let docsCount = docs.Count()
select new Time
Id = t.Id,
//... more simple mappings here
DocsCount = docsCount,
ThumbId = (tDoc != null && tDoc.FRKey.HasValue) ? tDoc.FRKey.Value : 0,
这使查询变得非常非常快。
【讨论】:
以上是关于如何改进 Linq-To-Sql 代码的主要内容,如果未能解决你的问题,请参考以下文章
数据访问层 - LINQ-To-SQL 和泛型。我可以优化这个吗?
如何关联不同 dbml 图上的 Linq-To-Sql 对象?