2011-08-21 5 views
2

J'ai la tableRejoindre requêtes avec Entity Framework

MOVIES_RATING:

  • MovieID int
  • MovieRating decimal

Je voudrais obtenir 2 valeurs à l'aide d'une requête:

select COUNT(*) 
FROM [dbo].[MOVIES_RATING] 
where [dbo].[MOVIES_RATING].[MovieID] = 78 

et

select SUM([dbo].[MOVIES_RATING].Rating) 
FROM [dbo].[MOVIES_RATING] 
where [dbo].[MOVIES_RATING].[MovieID] = 78 

C'est ce que je suis arrivé dans LINQ:

(from p in ef.MOVIES_RATING.Where(r => r.MovieID== movie_id) 
let movieRates = ef.MOVIES_RATING.Where(r => r.MovieID == movie_id) 
let count = movieRates.Count() 
let averageUserRating = movieRates.Sum(c => c.MOVIES_RATING)/count 
select new MovieRating {AverageUserRating = averageUserRating, VoteCount = count}) 
.Take(1); 

est affreux, ainsi que SQL généré:

SELECT 
[Limit1].[MovieID] AS [MovieID], 
[Limit1].[C2] AS [C1], 
[Limit1].[C1] AS [C2] 
FROM (SELECT TOP 1 
    [GroupBy1].[A1] AS [C1], 
    [Extent1].[MovieID] AS [MovieID], 
    [GroupBy2].[A1]/CAST([GroupBy1].[A1] AS decimal(19,0)) AS [C2] 
    FROM [dbo].[MOVIES_RATING] AS [Extent1] 
    CROSS JOIN (SELECT 
     COUNT(1) AS [A1] 
     FROM [dbo].[MOVIES_RATING] AS [Extent2] 
     WHERE [Extent2].[MovieID] = 78) AS [GroupBy1] 
    CROSS JOIN (SELECT 
     SUM([Extent3].[Rating]) AS [A1] 
     FROM [dbo].[MOVIES_RATING] AS [Extent3] 
     WHERE [Extent3].[MovieID] = 78) AS [GroupBy2] 
    WHERE [Extent1].[MovieID] = 78 
) AS [Limit1] 

Je ne suis pas sûr qu'il est préférable solution, de sorte que toute aide est appréciée.

Je sais que cela peut être fait en utilisant la procédure stockée, mais si cela pourrait être fait en utilisant LINQ ce serait mieux.

Répondre

1

Qu'en est-requête simple:

var query = from m in context.Movies 
      where m.Id == 78 
      select new 
       { 
        Count = m.MovieRatings.Count(), 
        Sum = m.MovieRatings.Sum(mr => mr.Rating) 
       }; 

var data = query.SingleOrDefault(); 

Déplacement calcul moyen à votre code d'application devrait réduire la complexité des requêtes SQL.

2
from r in ef.MOVIES_RATING 
group r by r.MovieID into g 
where g.Key == movie_id 
select new 
{ 
    Count = g.Count(), 
    Sum = g.Sum(r => r.Rating) 
} 

(ou peut-être filtrer d'abord, puis le groupe, il traduit probablement la même SQL de toute façon)

Une autre approche, en utilisant Aggregate:

ef.MOVIES_RATING 
    .Where(r => r.MovieID == movie_id) 
    .Aggregate(
     new { Count = 0, Sum = 0 }, 
     (acc, r) => new { Count = acc.Count + 1, Sum = acc.Sum + r.Rating }); 

(ne sais pas comment il se traduit à SQL si

+0

qui fonctionne aussi, merci! – bogert

+0

Mmmmmmmm. Agrégation. : -O – Arrow

Questions connexes