使用 Entity 按儿童系列订购的最佳方式

Best way to order by children collection with Entity

我正在寻找这个简单问题的最佳解决方案。
运行 在 C#/Entity 以下 SQL:

select user.name, userstat.point from user, userstat where userstat.user_id = user.id order by userstat.point desc

有一个用户 table [Id, Name, ...] 和统计 table [Id, UserId, Point. ...],它通过 Statistic.UserId 连接到用户。这是一个1:1关系,所以每个用户记录有(最多)1条统计记录。

我想要一个列表 User+Point,按 Point desc 排序,select 一个范围,比方说 1000-1100。

目前我有这个:

public List<PointItem> Get(int startPos, int count)
{
using (DB.Database db = new DB.Database())
{
   var dbList = db.Users.Where(user => .... ).ToList();

   List<PointItem> temp = new List<PointItem>(count);
   foreach (DB.User user in db.Users)
   {
       //should be always 1 stat for the user, but just to be sure check it...
       if (user.Stats != null && user.Stats.Count > 0)
          temp.Add(new PointItem { Name = user.Name, Point = user.Stats.First().Point });
   } <--- this foreach takes forever

   return temp.OrderByDescending(item => item.Point).Skip(startPos).Take(count).ToList();
}

}

它工作正常,但是当我有 10000 个用户(有 10000 个 UserStat)时,它 运行s 持续 100 秒,只比我想要的慢 1000 倍。

还有比这更有效的解决方案吗?

如果我运行SQL,10K的记录基本需要0秒

编辑

我让它变快了,现在是 100 秒 -> 1 秒,但我仍然希望它更快(如果可能的话)。

var userPoint = db.Users
    .Where(u => u.UserStats.Count > 0 && ....)  
    .Select(up => new
    {
        User = up,
        Point = up.UserStats.FirstOrDefault().Point
    })
    .OrderByDescending(up => up.Point)
    .ToList();

var region = userPoint.Skip(0).Take(100);

好的,我找到了解决方案,下面的代码是0.05秒。只需要从 child 到 parent:

    using (DB.Database db = new DB.Database())
    {
        var userPoint = db.UserStats
            .Where(s => s.User.xxx .....)
            .Select(userpoint => new
            {
                User = userpoint.User.Name,
                Point = userpoint.Point
            })
            .OrderByDescending(userpoint => userpoint.Point)
            .ToList().Skip(startPos).Take(count);
    }