繁体   English   中英

如何在 LINQ 和 SELECT COUNT 中使用 ORDER BY COUNT 呢?

[英]How to use ORDER BY COUNT in LINQ and SELECT COUNT it?

我有一个查询,我不知道将其更改为 LINQ

select distinct m.id,m.name, sch.id as schedule, COUNT(tk.id) as tiketSold
from movies m, schedules sch, tickets tk
where m.id = sch.movie_id and sch.id = tk.schedule_id
group by m.id,m.name, sch.id
order by COUNT(tk.id) desc

我正在努力:

var hotMovie = from m in _db.movies
                           from sch in _db.schedules
                           from tk in _db.tickets
                           where m.id == sch.movie_id && sch.id == tk.schedule_id
                           group m by m.id into g
                           orderby g.Count()
                           select new { Movie = g};

我没有你的数据库,所以我已经创建了 3 个类,就像我可以预料的那样。 然后我在“TestMethod”表中创建了 3 个列表。 In the linq query, I have joined the 3 list as you shown in sql query segment "where m.id = sch.movie_id and sch.id = tk.schedule_id" and then I perform the group by, order by an select. 这是我的代码,请尝试一下,让我知道它是否有效。

 public class movies
{
    public int id { get; set; }
    public string name { get; set; }
 
}

public class schedules
{
    public int id { get; set; }
    public int movie_id { get; set; }
}

public class tickets
{
    public int id { get; set; }
    public int schedule_id { get; set; }
}
 void TestMethod()
 {
        //Add Movies to the list
        List<movies> moviesItems = new List<movies>();
        moviesItems.Add(new movies() { id = 1, name = "A" });
        moviesItems.Add(new movies() { id = 2, name = "B" });

        //Add Schedules to the list
        List<schedules> schedulesItems = new List<schedules>();
        schedulesItems.Add(new schedules() { id = 1, movie_id = 1 });
        schedulesItems.Add(new schedules() { id = 2, movie_id = 2 });
        schedulesItems.Add(new schedules() { id = 3, movie_id = 1 });
        schedulesItems.Add(new schedules() { id = 4, movie_id = 2 });

        //Add Tickets to the list
        List<tickets> ticketsItems = new List<tickets>();
        ticketsItems.Add(new tickets() { id = 1, schedule_id = 1 });
        ticketsItems.Add(new tickets() { id = 2, schedule_id = 1 });
        ticketsItems.Add(new tickets() { id = 3, schedule_id = 2 });
        ticketsItems.Add(new tickets() { id = 4, schedule_id = 2 });
        ticketsItems.Add(new tickets() { id = 5, schedule_id = 2 });
        ticketsItems.Add(new tickets() { id = 6, schedule_id = 3 });
        ticketsItems.Add(new tickets() { id = 7, schedule_id = 3 });
        ticketsItems.Add(new tickets() { id = 8, schedule_id = 3 });
        ticketsItems.Add(new tickets() { id = 9, schedule_id = 3 });
        ticketsItems.Add(new tickets() { id = 10, schedule_id = 4 });

        var query = from final in (from m in moviesItems
                                   join sch in schedulesItems on m.id equals sch.movie_id
                                   join tk in ticketsItems on sch.id equals tk.schedule_id
                                   select new { movieID = m.id, movieName = m.name, schID = sch.id, tkID = tk.id })
                    group final by new { final.movieID, final.movieName, final.schID } into g
                    orderby g.Count() descending
                    select new { g.Key.movieID, g.Key.movieName, g.Key.schID, tiketSold = g.Count() };
}

此查询最接近您的 SQL 但可能您需要 LEFT JOIN。 如果您提供 model,也可以使用导航属性对其进行简化。

var hotMovie = 
   from m in _db.movies
   join sch in _db.schedules on m.id equals sch.movie_id
   join tk in _db.tickets on sch.id equals tk.schedule_id
   group tk by new { movieID = m.id, movieName = m.name, scheduleId = sch.id } into g
   orderby g.Sum(x => x.id != null ? 1 : 0) descending
   select new 
   { 
      g.Key.movieID, 
      g.Key.movieName, 
      g.Key.scheduleId, 
      tiketSold = g.Sum(x => x.id != null ? 1 : 0) 
   };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM