加入时在 linq 中排序

本文关键字:排序 linq | 更新日期: 2023-09-27 18:32:20

我必须展示最想看状态的电影。为此,我加入两个表 1。电影信息和 2.SeentItWantToSeeIt。我计算出最想看这个代码片段的电影。

public class RangkedMovieList
{
    public int MovieID { get; set; }
    public int count { get; set; }
}
rankedList = db.SeenItWantToSeeIt.Where(m => m.Status == 1 && m.MovieID != null)
                                 .GroupBy(m => m.MovieID)
                                 .Select(g => new RangkedMovieList 
                                              {  MovieID = g.Key.Value,
                                                 count = g.Count() 
                                              })
                                 .ToList();

AllMovieInfo是Iqueryable的,我加入了想看电影。

AllMovieInfo = (from r in rankedList
                join a in AllMovieInfo on r.MovieID equals a.MovieID
                orderby r.count descending
                select a).Distinct().AsQueryable();

此查询工作正常,并按 MovieID 对结果进行排序,但我想按他们想要看到的计数对所有电影进行排序。虽然我已经编写了代码按 r.count 降序排序,但它不起作用。请帮帮我。

加入时在 linq 中排序

我猜您的第二个 LINQ 查询是在数据库级别运行的。如果是这样,则Distinct调用很可能不遵循先前指定的排序顺序(事实上,如果删除Distinct调用并调试输出,它应该显示正确排序)。通常对于简单的查询,您可以通过交换排序顺序(即orderbyDistinct来解决此问题,同时将查询保持在数据库级别,如另一篇文章中所述,但您的情况有点复杂,因为您需要使用 rankingList .

在您的情况下,您可以通过添加ToList()(如对第一个查询所做的那样)或AsEnumerable() 将其降低到 LINQ 到对象级别。在该级别,您无需担心交换排序或不同调用的顺序。但是,您可能需要使用重载的 Distinct 方法,该方法接受IEqualityComparer并为AllMovieInfo提供比较器。查看链接以获取有关如何实现该示例的示例。

var query = (from r in rankedList
            join a in AllMovieInfo on r.MovieID equals a.MovieID
            select new { Info = a, Rank = r.count })
            .AsEnumerable()
            .OrderByDescending(o => o.Rank);
            .Select(o => o.Info)
            .Distinct(); // will likely need an IEqualityComparer here
// this could be combined with the above query, but I split it for clarity
AllMovieInfo = query.AsQueryable();

此时可能不需要该AsQueryable,因为此时它已在客户端的内存中。