2011-08-21 101 views
2

我有表加入查詢與實體框架

MOVIES_RATING:

  • MovieID int
  • MovieRating decimal

我想用一個查詢來獲取2個值:

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

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

這就是我在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); 

看起來可怕,以及SQL生成:

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] 

我不知道這是最好的解決方案,所以任何幫助表示讚賞。

我知道它可以使用存儲過程來完成,但如果它可以使用LINQ來完成,那會更好。

回答

1

什麼簡單的查詢:

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(); 

移動平均計算應用程序代碼應該減少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) 
} 

(或者過濾第一則組;它可能轉換到相同的SQL反正)

另一種方法,使用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 }); 

(不知道如何將其轉換爲SQL雖然)

+0

那也行,謝謝! – bogert

+0

mmmmmmm。聚合。 :-O – Arrow