Sum i subquery

Michał Warmuz
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:253
0

Cześć napisałem takie wyrażenie:

Kopiuj
            var payload = await db.Categories.Include(x=>x.Topics).ThenInclude(x=>x.Answers).Select(x => new CategoryList
            {
                Id = x.Id,
                Name = x.Name,
                Description = x.Description,
                TopicsCount = (uint)x.Topics.Count,
                AnswersCount = (uint)x.Topics.Sum(x=>x.Answers.Count)
                
            }).ToListAsync();

i mam taki błąd:

Kopiuj
Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
   at Microsoft.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__164_0(Task`1 result)
   at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()

Wiecie może dlaczego mam taki bład znaczy rozumiem że winą jest to:

Kopiuj
 AnswersCount = (uint)x.Topics.Sum(x=>x.Answers.Count)

ale kurcze jak inaczej mogę obliczyć ta sumę ? :)

AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około godziny
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
5

Nie wiem jak wyglądają twoje modele ale wydaje mi się, że brakuje ci GroupBy()

Kopiuj
var payload = await db.Categories
.Include(x=>x.Topics)
.ThenInclude(x=>x.Answers)
.GroupBy(x => x.TopicId) // Nie bardzo wiem też po czym chcesz grupować
.Select(x => new CategoryList
            {
                Id = x.Id,
                Name = x.Name,
                Description = x.Description,
                TopicsCount = (uint)x.Topics.Count,
                AnswersCount = (uint)x.Topics.Sum(x=>x.Answers.Count)

            }).ToListAsync();
Michał Warmuz
Dzięki zapomniałem że SUM() jest używana z klauzulą ​​GROUP BY() :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.