我必须展示最想看到状态的电影。为此,我加入两个表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是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订购结果,但我想按照他们想要的方式订购所有电影计数。虽然我已经将代码写入 orderby r.count descending ,但它无效。请帮帮我。
答案 0 :(得分:1)
我猜你的第二个LINQ查询是在数据库级别运行的。如果是这样,Distinct
调用可能不会遵循先前指定的排序顺序(事实上,如果您放弃Distinct
调用并调试输出,它应该显示正确排序)。通常,对于简单查询,您可以通过交换排序顺序(即orderby
)和Distinct
调用同时保持数据库级别as answered in another post的查询来解决此问题,但您的情况是因为你需要使用rankingList
,所以要复杂一点。
在您的情况下,您可以通过添加ToList()
(如第一个查询所做的那样)或AsEnumerable()
将其降低到LINQ to Objects级别。在该级别,您不必担心交换排序或不同调用的顺序。但是,您可能需要使用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
,因为它已经在客户端上,在内存中。