使用 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);
}
我正在寻找这个简单问题的最佳解决方案。
运行 在 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);
}