Код: Выделить всё
var topChallenges = await ChallengeRepository.GetAllAsQueryable()
.Where(c =>
c.ChallengeStatus != ChallengeStatusEnum.Draft &&
(!request.Data.MainDate.From.HasValue || c.StartDate >= request.Data.MainDate.From) &&
(!request.Data.MainDate.To.HasValue || c.EndDate request.Data.Segments.Select(x => x.Value).Contains(s.Value)))
)
.OrderByDescending(c => c.Milestones.Select(m => m.UserId).Distinct().Count())
.Take(3)
.Select(c => new
{
c,
DistinctUserCount = c.Milestones.Select(m => m.UserId).Distinct().Count(),
Name = c.ChallengeResources
.Where(r => r.SupportedLanguageId == Language.Id)
.Select(r => r.Name)
.FirstOrDefault(),
ImagePath = c.ChallengeImages
.OrderBy(ci => ci.Id)
.Select(ci => ci.Image)
.FirstOrDefault()
})
.AsNoTracking()
.ToListAsync();
и попробовал этот подход
Код: Выделить всё
var filteredChallenges = await ChallengeRepository.GetAllAsQueryable()
.Where(c =>
c.ChallengeStatus != ChallengeStatusEnum.Draft &&
(!request.Data.MainDate.From.HasValue || c.StartDate >= request.Data.MainDate.From) &&
(!request.Data.MainDate.To.HasValue || c.EndDate request.Data.Segments.Select(x => x.Value).Contains(s.Value)))
)
.Select(c => new
{
c.Id,
c.ChallengeStatus,
c.StartDate,
c.EndDate,
DistinctUserCount = c.Milestones.Select(m => m.UserId).Distinct().Count(),
Name = c.ChallengeResources
.Where(r => r.SupportedLanguageId == Language.Id)
.Select(r => r.Name)
.FirstOrDefault(),
ImagePath = c.ChallengeImages
.OrderBy(ci => ci.Id)
.Select(ci => ci.Image)
.FirstOrDefault()
})
.AsNoTracking()
.ToListAsync();
var topChallenges = filteredChallenges
.OrderByDescending(c => c.DistinctUserCount)
.Take(3)
.ToList();
и полностью разделить вычисления на разные этапы, используя этот подход
Код: Выделить всё
var challengeIdsWithCounts = await ChallengeRepository.GetAllAsQueryable()
.Where(c =>
c.ChallengeStatus != ChallengeStatusEnum.Draft &&
(!request.Data.MainDate.From.HasValue || c.StartDate >= request.Data.MainDate.From) &&
(!request.Data.MainDate.To.HasValue || c.EndDate request.Data.Segments.Select(x => x.Value).Contains(s.Value)))
)
.Select(c => new
{
ChallengeId = c.Id,
DistinctUserCount = c.Milestones.Select(m => m.UserId).Distinct().Count() // Database does the counting
})
.AsNoTracking()
.ToListAsync();
var topChallengeIds = challengeIdsWithCounts
.OrderByDescending(c => c.DistinctUserCount)
.Take(3)
.Select(c => c.ChallengeId)
.ToList();
var topChallenges = await ChallengeRepository.GetAllAsQueryable()
.Where(c => topChallengeIds.Contains(c.Id))
.Select(c => new
{
c.Id,
c.ChallengeStatus,
c.StartDate,
c.EndDate,
DistinctUserCount = c.Milestones.Select(m => m.UserId).Distinct().Count(),
Name = c.ChallengeResources
.Where(r => r.SupportedLanguageId == Language.Id)
.Select(r => r.Name)
.FirstOrDefault(),
ImagePath = c.ChallengeImages
.OrderBy(ci => ci.Id)
.Select(ci => ci.Image)
.FirstOrDefault()
})
.AsNoTracking()
.ToListAsync();
topChallenges = topChallenges
.OrderByDescending(c => c.DistinctUserCount)
.ToList();
Что-то пошло не так. Вторая операция была запущена в этом экземпляре контекста до завершения предыдущей операции. Обычно это вызвано тем, что разные потоки одновременно используют один и тот же экземпляр DbContext. Дополнительные сведения о том, как избежать проблем с потоками с помощью DbContext, см. на странице https://go.microsoft.com/fwlink/?linkid=2097913. SourceContext: (Dsquares.Logging.Middleware.Request_Respons_Middleware)
Я даже проверил ссылку о том, как избежать проблем с потоками в Microsoft, но до сих пор не могу понять, в чем проблема? также мой контекст базы данных зарегистрирован как ограниченный, а не одноэлементный
Подробнее здесь: https://stackoverflow.com/questions/798 ... leted-erro
Мобильная версия