Linq查询C#和LINQPad之间的性能

时间:2013-01-11 17:55:57

标签: c# performance linq entity-framework linqpad

在我的应用程序中使用此linq查询:

var r = from uev in UtilisateurEpisodeVus
        group uev by uev.Episode.Saison.Serie into pgroup
        let count = pgroup.Count()
        orderby count descending
        select new SerieVu() { nombreDeVus = count, Serie = pgroup.Key };
return r.ToList();

在LINQPad中使用与实体框架相同的连接使用大致相同的查询:

from uev in UtilisateurEpisodeVus
group uev by uev.Episode.Saison.Serie into pgroup
let count = pgroup.Count()
orderby count descending
select pgroup.Key

在我的申请中:

resultat.ToList()

大约需要45秒。

在LINQPad中需要191毫秒。

请问有什么问题?

2 个答案:

答案 0 :(得分:3)

感谢您的帮助我使用Entity Framework Profiler试用版找到了解决方案。实际上我这样做了:

IEnumerable<UtilisateurEpisodeVu>   listUtilisateurEpisodeVu = Query(uev => uev.userepivu_date > dateIlYaSeptJours);

var resultat =
from uev in listUtilisateurEpisodeVu
group uev by uev.Episode.Saison.Serie into pgroup
let count = pgroup.Count()
orderby count descending
select new SerieVu() { nombreDeVus = count, Serie = pgroup.Key };

通过做:

var resultat =
from uev in Query(uev => uev.userepivu_date > dateIlYaSeptJours)
group uev by uev.Episode.Saison.Serie into pgroup
let count = pgroup.Count()
orderby count descending
select new SerieVu() { nombreDeVus = count, Serie = pgroup.Key };

直接在我的linq查询中使用Query,性能很好......我不明白为什么。如果有人有任何想法,我会很高兴知道答案。再次感谢

答案 1 :(得分:2)

当你说

IEnumerable<UtilisateurEpisodeVu>   listUtilisateurEpisodeVu
from uev in listUtilisateurEpisodeVu
group uev

您正在对IEnumerable<T>进行分组,该System.Linq.Enumerable.GroupBy将变为from uev in Query(uev => uev.userepivu_date > dateIlYaSeptJours) group uev 上的一个调用,该调用将加载整个表并在本地执行。


当你说

IQueryable<T>

您正在对System.Linq.Queryable.GroupBy进行分组,该IQueryable<UtilisateurEpisodeVu> listUtilisateurEpisodeVu from uev in listUtilisateurEpisodeVu group uev 将变为{{1}}上的呼叫,该呼叫将转换为sql并发送到数据库。

您可以通过更改变量的类型来获得相同的结果:

{{1}}