我希望看到的(如果这是数据库结构的来源,则永远不会查看 Discord)将是一个表:
我希望 dbContext.Users 有类似的东西:
UserId | UserName
然后是公会表,其中包含以下内容:
GuildId | GuildName | UserId
和体验看起来像:
ExperienceId | UserId
我会在这里继续做一些假设:
Context.Guild.GetUser(n).ToString();
在我看来,这就像一个转换为 SQL 的 EF Core 查询:
select UserId from Guild
据此,我发现了一些潜在问题:
首先,Guild 方法只返回一个字符串或 long 很奇怪。如果这是您的实现,则返回一个对象。
更重要的是,您可以在 1 个查询中执行此操作:
在 Sql 中:
Select g.GuildId, e.Experiece, u.UserId, u.UserName from Guild g
left join Users u on g.UserId = u.UserId
left join Experiences e on u.UserId = e.UserId
where g.GuildId = @myGuildId
order by e.Experience Desc
这会给你返回如下行:
1 | 1500 | 10 |咬勺
1 | 1450 | 51 |丢失的肘部
1 | 1121 | 98 |地球天火
1 | 990 | 15 |金鹅
我会做什么:创建一个视图类,并使用查询中的 AutoMapper 之类的东西映射它,或者在您具体化实例时映射它:
创建一个类:
public class LeaderView
{
public string UserName {get; set;}
public long UserId {get; set;}
public long GuildId {get; set; }
public int Experience { get; set; }
}
然后是 linq to Sql 查询,如:
var leaders = from g in context.Guilds
join u in context.Users on g.UserId = u.UserId
join e in context.Experience on u.UserId = e.UserId
select new LeaderView
{
UserName = u.UserName,
UserId = u.UserId,
GuildId = g.UserId,
Experience = e.Experience
};
leaders = leaders.OrderByDescending(o => o.Experience);
return leaders.ToList();