多个LINQ to SQL查询。枚举优化

时间:2016-06-02 23:22:55

标签: c# winforms linq-to-sql

我有一个~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秒,这并不令人惊讶,但考虑到标准是令人满意的。

谢谢!

2 个答案:

答案 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

  

我真正的问题是我必须枚举每个查询,这真的   杀死了表演。

除非您枚举结果,否则不会调用服务器。所以难怪没有枚举就很快。但这并不意味着枚举就是问题。