加入时在 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 查询是在数据库级别运行的。如果是这样,则Distinct
调用很可能不遵循先前指定的排序顺序(事实上,如果删除Distinct
调用并调试输出,它应该显示正确排序)。通常对于简单的查询,您可以通过交换排序顺序(即orderby
)Distinct
来解决此问题,同时将查询保持在数据库级别,如另一篇文章中所述,但您的情况有点复杂,因为您需要使用 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
,因为此时它已在客户端的内存中。