EF Core nie radzi sobie z przetłumaczeniem czegoś takiego:
_db.Reviews
.Select(review => new ReviewModel
{
Id = review.Id,
CustomerId = review.CustomerId,
CustomerFirstName = review.Customer.FirstName,
Stars = review.Stars,
Content = review.Content,
CreatedAt = review.CreatedAt,
PositiveOpinionCount = review.Opinions.Count(o => o.IsReviewHelpful),
NegativeOpinionCount = review.Opinions.Count(o => !o.IsReviewHelpful),
CustomerOpinion = review.Opinions
.Where(o => o.CustomerId == currentCustomerId)
.Select(o => new CustomerOpinionModel {IsReviewHelpful = o.IsReviewHelpful})
.FirstOrDefault()
})
EF Core 3 rzuca wyjątek, bo nie może tego wysłać w jednym zapytaniu. EF Core 2 co prawda nie rzuca wyjątku, ale wysyła n+1
zapytań (dla n
recenzji n
razy wysyła zapytanie o opinię klienta). Jak sobie z tym poradzić? Można pobrać opinie osobno, ale wtedy w każdym z 2 zapytań czytamy tabelkę Opinions
. Do głowy przychodzi mi jedynie utworzenie widoku z recenzji - wtedy Positive/NegativeOpinionCount
będzie od razu na miejscu. Ale co jeśli tabela i widok byłyby duże? Macie jakiś pomysł?