繁体   English   中英

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

[英]Multiple LINQ to SQL queries. Enumeration optimisation

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

谢谢!

这可以通过使用Teams.Select(team => ..)完成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.NETDapperEntityFramework进行调用(选择的顺序是从最佳到平凡)。我的建议是使用Dapper 这将加快查询速度,尤其是在表已正确索引的情况下。

要将15k参数有效地馈入服务器,可以使用TVP: http : //blog.mikecouturier.com/2010/01/sql-2008-tvp-table-valued-parameters.html

我的真正问题是,我必须枚举每个查询,这确实降低了性能。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM