【发布时间】:2018-01-07 11:41:16
【问题描述】:
我必须对您的数据库进行复杂查询。但查询在 8000 毫秒处结束。我做错了吗?我使用 .net 1.1 和 Entity Framework core 1.1.2 版本。
var fol = _context.UserRelations
.Where(u => u.FollowerId == id && u.State == true)
.Select(p => p.FollowingId)
.ToArray();
var Votes = await _context.Votes
.OrderByDescending(c => c.CreationDate)
.Skip(pageSize * pageIndex)
.Take(pageSize)
.Where(fo => fol.Contains(fo.UserId))
.Select(vote => new
{
Id = vote.Id,
VoteQuestions = vote.VoteQuestions,
VoteImages = _context.VoteMedias.Where(m => m.VoteId == vote.Id)
.Select(k => k.MediaUrl.ToString()),
Options = _context.VoteOptions.Where(m => m.VoteId == vote.Id).Select( ques => new
{
OptionsID = ques.Id,
OptionsName = ques.VoteOption,
OptionsCount = ques.VoteRating.Count(cout => cout.VoteOptionsId == ques.Id),
}),
User = _context.Users.Where(u => u.Id == vote.UserId).Select(usr => new
{
Id = usr.Id,
Name = usr.UserProperties.Where(o => o.UserId == vote.UserId).Select(l => l.Name.ToString())
.First(),
Surname = usr.UserProperties.Where(o => o.UserId == vote.UserId)
.Select(l => l.SurName.ToString()).First(),
ProfileImage = usr.UserProfileImages.Where(h => h.UserId == vote.UserId && h.State == true)
.Select(n => n.ImageUrl.ToString()).First()
}),
NextPage = nextPage
}).ToListAsync();
【问题讨论】:
-
您的数据库中有一个或多个相关索引吗? (你应该可以在VS的输出窗口看到SQL请求,然后你可以在SQL Server Managment Studio中运行这个请求,看看实际的执行计划)
-
我的数据库架构。 prntscr.com/hx6btm
-
乍一看有点啰嗦
-
难怪它很慢。你甚至明白你在那里做什么吗?对于每一票,您都在执行 3 个查询。因此,如果您有 1000 票,您将对数据库进行 3000 次(!!!!)查询。您如何期望它会很快?您应该考虑您想要获取的数据并使用 EF Cores eager loading 在几个查询中获取大部分数据
标签: c# .net entity-framework asp.net-core entity-framework-core