2

目标是获取 10 部热门电影的列表。

在数据库中调用了一个表populars,其中包含: moviecount- 电影被租用的次数。 MovieID- 电影的 ID。

还有一个名为 Movies 的表,其中包含电影的所有数据。此表包含 MovieID 的字段。这些表不相关,不应在它们之间链接。

我拿了10部最受欢迎电影的id

var TopTen = videoLibDB.populars
                 .Take(10)
                 .OrderBy(e => e.movieCount)
                 .Select(e => new { e.MovieID });

没关系,但是如何使用流行表的 10 个 MovieID(上面代码的前十名)从“电影”表中创建 10 部最佳电影的列表?

如果是一个 id,我可以将流行表中的 moiveid 与电影表中的 movieid 进行比较。

4

5 回答 5

2

如果您正确设置了关系,@JimWooley 上面的答案是最简单/最好的,这个查询是为了以防您没有这种可能性。

您的 linq 查询中存在一些问题,您正在随机选取 10 部电影并仅对它们进行排名,最不受欢迎的电影排在第一位。此查询修复了该问题并将其与电影表连接以获取最受欢迎的电影;

var query = 
    from movie in videoLibDB.movies
    where
        videoLibDB.populars
        .OrderByDescending(x => x.movieCount)   // Sort all, most popular first
        .Take(10)                               // but only keep the 10 first
        .Select(x => x.MovieID)                 // Take their MovieID 
        .Contains(movie.MovieID)                // and get movie data on them
    select movie;
于 2012-09-18T18:43:54.370 回答
2

首先,请确保在拍摄之前进行排序(OrderBy)。在 LINQ to SQL/EF 中,这可能并不重要,但使用 LINQ to Objects 将导致仅评估前十行。

其次,您需要将热门电影与电影连接起来,或者使用表格之间的关联。假设您有一个关联设置,您应该能够执行以下操作:

var TopTen = videoLibDB.populars
             .OrderByDescending(e => e.movieCount)
             .Take(10)
             .Select(e => new { e.MovieID, e.Movie.MovieName});
于 2012-09-18T18:36:56.010 回答
0

我不明白为什么你有这样的限制,表格可能没有链接......但是嘿......

var TopTen = videoLibDB.populars
       .OrderBy(e => e.movieCount)
       .Take(10)
       .Select(e => e.MovieID).ToArray();

var YourActualMovies = videoLibDB.movies
       .Where(x=>TopTen.Conatins(x.MovieID))
       .Select(...whatever you want...)
于 2012-09-18T18:43:35.193 回答
0

试试这个,它应该生成一个IN子句。

var results = from q in videoLibDB.movies
              where videoLibDB.populars
                    .OrderBy(e => e.movieCount)
                    .Take(10)
                    .Select(e => e.MovieID)
                    .ToArray()
                    .Contains(q.MovieID)
              select q

是一篇更深入的文章。

于 2012-09-18T18:36:26.900 回答
0

使用 .Contains

首先创建一个包含 ID 的数组......

var ids = new[] { 1,2,3,4,5,6,7,8,9,10 };

然后使用 .Contains

var TopTen = videoLibDB.populars
    .Where(e => ids.Contains(e.MovieID)
    .OrderBy(e => e.movieCount)
    .Select(e => new { e.MovieID });

相当于 T-SQL 中的 IN 语句

于 2012-09-18T18:37:49.197 回答