【问题标题】:Select items from list using many ids使用多个 ID 从列表中选择项目
【发布时间】:2013-04-04 07:22:06
【问题描述】:

目标是获取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(上面代码的 TopTen)从“电影”表中创建 10 部最佳电影的列表?

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

【问题讨论】:

  • 您可以在 LINQ 中执行 join,就像您在 SQL 中执行 join 一样。
  • 顺便说一句,你的 TopTen 取前 10 个,然后对它们进行排序.. 应该反过来做

标签: c# linq


【解决方案1】:

如果您正确设置了关系,@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】:

    首先,请确保在拍摄前进行排序 (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});
    

    【讨论】:

    • 应该是 OrderByDescending。
    • 表格不相关,无法相互链接
    • @JoachimIsaksson 谢谢你的收获。已在答案中更正。
    • @AmirCabili 表在同一个数据库中吗?如果是这样,您可以在模型中使用关联,即使它们不在具有 LINQ to SQL 或 EF 的数据库中。如果您不想使用关联,可以使用联接。如果它们不在同一个数据库中,您将需要获取这些值,然后通过 LINQ 将它们连接到客户端中的对象,或者如果您知道内存中的集合包含少于 2000 条记录,则使用包含。请澄清“不能在它们之间链接”的要求来自哪里。
    【解决方案3】:

    使用 .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】:

      试试这个,它应该会生成一个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 更深入。

      【讨论】:

        【解决方案5】:

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

        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...)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多