将查询与实体框架连接

时间:2011-08-21 12:20:17

标签: linq entity-framework

我有桌子

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 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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查询的复杂性。