我有一个包含构建列表的表。我想要实现的是通过引用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个最新版本。怎么做?
答案 0 :(得分:2)
一种好方法是确定它生成的SQL是使用LINQpad之类的工具。一旦了解了SQL的外观,就可以使用SQL工具,如执行计划生成。
或者您也可以使用SQL事件探查器查看SQL查询的内容。