2017-08-01 158 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(), 
      });