【问题标题】:Order by in linq on joining加入时在 linq 中订购
【发布时间】:2013-09-22 00:19:13
【问题描述】:

我必须展示最想看到状态的电影。为此,我加入两个表 1.MovieInformation 和 2.SentItWantToSeeIt。我用这个代码sn-ps计算了最想看的电影。

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 对结果进行排序,但我想按他们想看的 count 对所有电影进行排序。虽然我已经编写了 orderby r.count descending 的代码,但它不起作用。请帮帮我。

【问题讨论】:

    标签: c# asp.net-mvc linq


    【解决方案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,因为此时它已经在客户端的内存中。

    【讨论】:

    • 许多来自我的祖国尼泊尔的“Namaskar”。这段代码 sn-p 完全符合我的预期!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多