我必须显示最想看到状态的电影。为此,我加入了两个表 1. MovieInformation 和 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 是可查询的,我加入了它想看电影。
AllMovieInfo = (from r in rankedList
join a in AllMovieInfo on r.MovieID equals a.MovieID
orderby r.count descending
select a).Distinct().AsQueryable();
此查询工作正常并按 MovieID 对结果进行排序,但我想按他们想看的计数 对所有电影进行排序。虽然我已经编写了代码以 orderby r.count descending,但它不起作用。请帮帮我。
最佳答案
我猜您的第二个 LINQ 查询是在数据库级别运行的。如果是这样,Distinct
调用可能不会遵循之前指定的排序顺序(事实上,如果您放弃 Distinct
调用并调试输出,它应该出现正确排序)。通常对于简单查询,您可以通过交换排序顺序(即 orderby
)和 Distinct
调用来解决此问题,同时保持数据库级别的查询,as answered in another post ,但是您的情况稍微复杂一些,因为您需要使用 rankingList
。
在您的情况下,您可以通过添加 ToList()
将其降低到 LINQ to Objects 级别,就像您对第一个查询所做的那样,或者添加一个 AsEnumerable()
.在该级别,您无需担心交换排序或不同调用的顺序。但是,您可能需要使用 overloaded Distinct
method that accepts an 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
,因为此时它已经在客户端上,在内存中。
关于c# - 加入时在 linq 中排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18939039/