Search code examples
c#linqsql-to-linq-conversion

Converting SQL to Linq in c#


I am trying to convert some SQL Code to c# Linq:

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

which displays

Paul    6
Mike    4
Donna   3
Elliot  2

I tried to use Linqer which made this more complicated and didnt return any results:

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)
                };

Your help would be appreciated.

Thanks


Solution

  • Assuming CompletedBy and UserId columns are both uniqueidentifier in the database, you shouldn't need to do any type conversion.

    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()
            };