使用许多ID从列表中选择项目

时间:2012-09-18 18:32:06

标签: c# linq

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

数据库中有一个名为populars的表,其中包含:  moviecount - 电影出租的次数。  MovieID - 电影的身份。

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

我拍了10部最受欢迎的电影

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

这没关系,但如何使用populars表的10个MovieID(上面代码的TopTen)从“电影”表创建10部最佳电影的列表?

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

5 个答案:

答案 0 :(得分:2)

首先,确保在拍摄前排序(OrderBy)。在LINQ to SQL / EF中,这可能并不重要,但是对于LINQ to Objects,它只会导致前10行被评估。

其次,您需要将影片加入电影,或使用表格之间的关联。假设您有关联设置,您应该能够执行以下操作:

var TopTen = videoLibDB.populars
             .OrderByDescending(e => e.movieCount)
             .Take(10)
             .Select(e => new { e.MovieID, e.Movie.MovieName});

答案 1 :(得分: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;

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

here is an article更深入。

答案 3 :(得分: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语句

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