2017-08-01 162 views
3

型号:选择从的GroupBy列表中选择特定的列

public class Ticket { 
    public Ticket(); 

    public int Id { get; set; } 
    public virtual TicketUrgency TicketUrgency { get; set; } 
    public int UrgencyId { get; set; } 
} 

public class TicketUrgency { 
    public TicketUrgency(); 
    [Key] 
    public int Id { get; set; } 
    [MaxLength(50)] 
    [Required] 
    public string Name { get; set; } 
    public ICollection<Ticket> Tickets { get; set; } 
} 

我有以下LINQ声明:

var model = Entities 
       .Include(x => x.TicketUrgency) 
       .GroupBy(x => x.UrgencyId) 
       .Select(g => new { 
        id = g.Key, 
        count = g.Count(), 
        name = g.FirstOrDefault(u => u.UrgencyId == g.Key).TicketUrgency.Name 
       }); 

我通过UrgencyIdEntities组,然后返回键(UrgencyId),并且还单个组中项目的数量并显示紧急度的名称。

当我运行它时,查询就会挂起而没有任何异常。

+2

为什么不用其他方式?找回所有紧急事件和门票的数量 – ASpirin

+0

您使用的是什么EF? – NetMage

+0

我正在使用EF核心 –

回答

1

这应该工作,围绕做它的其他方式,首先检索所有TicketUrgencies和分组它。

Entities.Include(e => e.Tickets) 
       .GroupBy(t => t.Id) 
       .Select(g => new { 
        id = g.Key, 
        name = g.FirstOrDefault().Name, 
        count = g.FirstOrDefault().Tickets.Count() 
       }); 
1

很简单。刚刚尝试这一点:

var model = Entities 
       .Include(x => x.TicketUrgency) 
       .GroupBy(x => new {UrgencyId = x.UrgencyId , 
          Name = x.TicketUrgency.Name}) 
       .Select(x=> new { UrgencyId = x.Key.UrgencyId, 
            Name = x.Key.Name, 
            Count = x.Count()}); 
+0

使用此功能,您无法获得组的项目数量。 x.Count不起作用。 –

+0

@ElenaMaximova对不起,这是错误的。现在尝试代码 –

+0

我得到一个错误:迭代查询结果时数据库中发生异常。 ORA-00905:缺少关键字 –

1

,你可以按这两个属性:

var model = Entities 
      .Include(x => x.TicketUrgency) 
      .GroupBy(x => new{ x.UrgencyId, x.TicketUrgency.Name }) 
      .Select(g => new { 
       id = g.Key.UrgencyId, 
       count = g.Count(), 
       name = g.Key.Name 
      }); 

另一种方式可能是,作为@ASpirin建议,开始从TickerUrgency查询:

var result= TicketUrgencies.Include(t=>t.Tickets) 
          .Where(t=>t.Tickets.Any()) 
          .Select(t=> new {id=t.Id,name=t.Name, count= t.Tickets.Count()}) 
1

由于您正在按UrgencyId进行分组,您知道g的所有成员都与Key具有相同的编号,因此只需拉第一个名称即可。你也知道g是不是空的,因为这会不会做一团:

var model = Entities 
      .Include(x => x.TicketUrgency) 
      .GroupBy(x => x.UrgencyId) 
      .Select(g => new { 
       id = g.Key, 
       name = g.First().TicketUrgency.Name 
       count = g.Count(), 
      });