C# 加入时linq中的Order by
我必须放映那些最想看的电影。为此,我加入了两个表1。电影资讯及2。看不见。我用这些代码片段计算出最想看的电影C# 加入时linq中的Order by,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我必须放映那些最想看的电影。为此,我加入了两个表1。电影资讯及2。看不见。我用这些代码片段计算出最想看的电影 public class RangkedMovieList { public int MovieID { get; set; } public int count { get; set; } } rankedList = db.SeenItWantToSeeIt.Where(m => m.Status == 1 && m.MovieID != nu
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编写了代码,但它不起作用。请帮帮我。我猜您的第二个LINQ查询正在数据库级别运行。如果是这样的话,
Distinct
调用很可能不会遵循之前指定的排序顺序(事实上,如果您放弃Distinct
调用并调试输出,它应该正确排序)。通常,对于简单查询,您可以通过交换排序顺序(即,orderby
)和Distinct
调用来解决此问题,同时将查询保持在数据库级别,但您的情况稍微复杂一些,因为您需要使用rankingList
在您的例子中,您可以通过添加一个ToList()
(与第一个查询相同)或一个AsEnumerable()
,将其降低到LINQ to Objects级别。在这个级别上,您不需要担心交换排序或不同调用的顺序。但是,您可能需要使用并为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
,因为它已经在客户端的内存中了。许多来自我的祖国尼泊尔的“Namaskar”。这个代码片段完全按照我的预期工作!