Объединение запросов с Entity Framework - PullRequest
2 голосов
/ 21 августа 2011

у меня есть стол

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, было бы лучше.

Ответы [ 2 ]

2 голосов
/ 21 августа 2011
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-запрос)хотя переводится на SQL)

1 голос
/ 21 августа 2011

А как насчет простого запроса:

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-запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...