2017-02-13 59 views
0

我想一些SQL代码转换为C#中的LINQ:转换SQL的LINQ C#

SELECT Username, Count(Ticket.TicketId) as 'Tickets Completed' 
FROM Ticket 
INNER JOIN TicketStatus ON Ticket.TicketStatusID = TicketStatus.TicketStatusID 
INNER JOIN Membership ON Ticket.CompletedBy = Membership.UserId 
WHERE Ticket.ClosedDate >= @StartDate 
     and Ticket.ClosedDate <= @EndDate 
GROUP BY Username 
ORDER BY 'Tickets Completed' DESC 

,显示

Paul 6 
Mike 4 
Donna 3 
Elliot 2 

我试图用Linqer这让这更复杂,并没有回报任何结果:

var query = from Ticket in data.Tickets 
       join Membership in data.Memberships on new { CompletedBy = Guid.Parse(Ticket.CompletedBy.ToString()) } equals new { CompletedBy = Membership.UserId } 
       where 
        Ticket.ClosedDate >= StartDate && 
        Ticket.ClosedDate <= EndDate 
       group new { Membership, Ticket } by new 
       { 
        Membership.Username 
       } into g 
       orderby 
        "Tickets Completed" descending 
       select new 
       { 
        Username = g.Key.Username, 
        Completed = g.Count(p => p.Ticket.TicketID > 0) 
       }; 

您的帮助,将不胜感激。

感谢

+0

你确定数据不是空的吗?你在使用ORM吗? –

回答

1

假设CompletedByUserId列在数据库中都uniqueidentifier,你应该不需要做任何类型转换。

var query = from t in db.ticket 
     join ts in db.ticketStatus 
     on t.TicketStatus.ID equals ts.TicketStatusID 
     join m in db.Membership 
     on t.CompletedBy equals m.UserId 
     where t.ClosedDate >= startDate 
      && t.closedDate <= endDate 
     group t by m.UserName into tGroup 
     order by tGroup.Count(t=> t.TicketId) decending 
     select new { 
      UserName = tGroup.Key, 
      TicketCount = tGroup.Count() 
     }; 
+0

为什么不只是用m.UserName来分组?它也应该是'tGroup.Count()'。 – juharr

+0

更新了代码..谢谢。有一个旧的答案答案仍然执行 –

+0

这是完美的谢谢你。我一直在挠头约4个小时,你在4分钟内解决了它!再次感谢你。 – Belliez