我有一个~15,000'团队的列表,需要一个单独的linq查询才能返回结果。
即 - [为'团队'选择最后10场比赛]
public IEnumerable<ResultsByDate> SelectLast10Games(DateTime date, string team)
{
return
( from e in db.E0s
where e.DateFormatted < date &&
(e.HomeTeam == team || e.AwayTeam == team)
orderby e.Date descending
select new ResultsByDate
{
Date = e.Date,
HomeTeam = e.HomeTeam,
AwayTeam = e.AwayTeam,
HomeGoals = e.FTHG,
AwayGoals = e.FTAG
}
).Take(10);
}
这个查询可能很好,当调用15,000次时看起来足够快。
我真正的问题是我必须枚举每个查询,这确实会影响性能。
对于每个查询,我需要对10个结果运行一个方法,因此查询需要枚举。
问题是如何避免15,000次枚举?
我考虑将每个结果放入一个大的列表中,然后然后调用.ToList()或者其他什么是最好的,但是添加到List会随着它的进行而枚举,所以这似乎不可行
有没有办法将所有15,000个LINQ查询组合成一个巨大的LINQ查询,例如..
public IEnumerable<ResultsByDate> SelectLast10Games(DateTime date, List<string> Teams)
{
foreach(var team in Teams)
{ var query =
(from e in db.E0s
where e.DateFormatted < date &&
(e.HomeTeam == team || e.AwayTeam == team)
orderby e.Date descending
select new ResultsByDate
{
Date = e.Date,
HomeTeam = e.HomeTeam,
AwayTeam = e.AwayTeam,
HomeGoals = e.FTHG,
AwayGoals = e.FTAG
}
).Take(10);
}
}
所以这会返回一个巨大的结果集,然后我可以一次性枚举并从那里开始工作?
我已经尝试但似乎无法使LINQ循环正确(如果它甚至可能 - 以及解决我的问题的最佳方法)。
整个程序需要约29分钟才能完成。如果没有列举它的大约30秒,这并不令人惊讶,但考虑到标准是令人满意的。
谢谢!
答案 0 :(得分:1)
使用Teams.Select(team => ..)
var query = Teams
.Select(team =>
db.E0s
.Where(e => e.DateFormatted < date && (e.HomeTeam == team || e.AwayTeam == team))
.OrderByDescending(e => e.Date)
.Select(
e =>
new ResultsByDate {
Date = e.Date,
HomeTeam = e.HomeTeam,
AwayTeam = e.AwayTeam,
HomeGoals = e.FTHG,
AwayGoals = e.FTAG
}
)
.Take(10)
)
如果您要为大量查询寻找最佳性能,则应考虑使用 SQL存储过程并使用 ADO.NET , Dapper调用它或 EntityFramework (选择的顺序是从最佳到平凡)我的建议是使用 Dapper 。这将加快您的查询速度,尤其是在表格索引正确的情况下。
答案 1 :(得分:0)
要将15k参数有效地输入服务器,您可以使用TVP: http://blog.mikecouturier.com/2010/01/sql-2008-tvp-table-valued-parameters.html
我真正的问题是我必须枚举每个查询,这真的 杀死了表演。
除非您枚举结果,否则不会调用服务器。所以难怪没有枚举就很快。但这并不意味着枚举就是问题。