Linq查询非常慢

时间:2015-03-18 14:37:41

标签: c# sql-server linq

我有一个包含构建列表的表。我想要实现的是通过引用ID对这些构建进行分组,并采用最新的5或10个(build_date)并查看其状态。所以我现在正在组织并返回它们。

using (var ctx = new Entities())
{
    return ctx.Builds.Where(x => x.build_date > dateTime)
                .GroupBy(x => new
                {
                    x.configuration_id
                })
                .Select(s => new ConfigurationBuilds
                {
                    ConfId = s.Key.configuration_id,
                    Builds = s.Select(x => x).OrderByDescending(d => d.build_date).Take(count)
                })
                .ToList();
}

稍后在另一种方法中,我将检查所有状态Builds项目,看它们是否符合任何标准,例如:

items.Where(build => build.Builds.Count() >= 9)
                    .Where(build => build.Builds.All(x => !x.build_status.Equals("SUCCESSFUL")))
                    .ToList();

问题在于我做groupBy的第一个查询。那个非常慢,我怎么能优化那个例行程序呢?

我创建了一个虚拟例程来选择所有构建并按状态分组

var items = ctx.Builds.Where(x => x.build_date > dateTime).OrderByDescending(x=>x.build_id)
                    .GroupBy(x => new {
                        confID = x.configuration_id,
                        status = x.build_status
                        })
                .Select(s => new 
                    {
                        Id = s.Key.confID,
                        Status = s.Key.status,
                        Cnt = s.Count()
                    }).OrderBy(d=>d.Id)
                    .ToList();

这个相同数据的速度非常快,但并不能真正满足我的需求。我需要:对于每个配置组,选择符合某些条件的n个最新版本。怎么做?

1 个答案:

答案 0 :(得分:2)

一种好方法是确定它生成的SQL是使用LINQpad之类的工具。一旦了解了SQL的外观,就可以使用SQL工具,如执行计划生成。

或者您也可以使用SQL事件探查器查看SQL查询的内容。