在linq上订购加入

时间:2013-09-22 00:19:13

标签: c# asp.net-mvc linq

我必须展示最想看到状态的电影。为此,我加入两个表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 ,但它无效。请帮帮我。

1 个答案:

答案 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,因为它已经在客户端上,在内存中。