linq - 使用 Entity Framework 连接查询

标签 linq entity-framework

我有 table

MOVIES_RATING:

  • MovieID int
  • 电影分级小数

我想使用一个查询获取 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 来完成那就更好了。

最佳答案

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)

另一种方法,使用聚合:

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)

关于linq - 使用 Entity Framework 连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7138214/

相关文章:

mysql - EF6 和 MySQL 从模型生成数据库

c# - 我可以在 Entity Framework SubQuery 中使用扩展方法吗?

c# - 模拟 DbSet 不返回对象

c# - 使用 Htmlagilitypack + LINQ + Lambda 提取表

c# - 在多个链式 LINQ 查询中使用一个变量

asp.net-mvc - EnumDataType 属性在 ASP.NET MVC 中起什么作用?

c# - 使用 Entity Framework 时如何将数据库用户名和密码安全地存储在 web.config 文件中

c# - LINQ - 将组转换为数组

c# - (Linq to Sql) 中 (Linq to Entity) 的 GetCommand() 函数的等价物

c# - 我如何通过Linq C#获得每个数组的第一个元素