Объедините две строки данных, используя LINQ / SQL - PullRequest
1 голос
/ 30 ноября 2010

У меня есть ситуация, когда мой запрос возвращает следующие две строки:

UserName  ID  Designation   RoleID

shd.1234   3        1          2

shd.1234   3        1          5

Я могу отобразить эти результаты в Jqgrid с помощью LINQ.

Однако я хочу отобразить егокак в одной строке: (если RoleID равен 5, отобразите его в другом столбце в той же строке.)

UserName  ID  Designation   RoleID    AdditionalRoleID

shd.1234   3        1          2            5

Мой текущий запрос выглядит примерно так:

empDetails = (from u in ObjectContext.USERS
              join ed in ObjectContext.USERS_EMPLOYEE_DETAILS on u.UserID equals ed.UserID
              join r in ObjectContext.ROLES_FOR_USERS on u.UserID equals r.UserID
              join ro in ObjectContext.ROLES on r.RoleID equals ro.RoleID
              where (r.HospitalID == Context.CurrentUser.HIdentity.HospitalID)
              where(r.RoleID!= 4)
              select new Models.AdminModelSettings.EmployeeDetailsForGivenHospital
              {
                  UserName = u.UserName,
                  EmployeeId = ed.ID,
                  EmployeeDesignation = ed.Designation,
                  RoleID = r.RoleID,
                  RoleName = r.RoleID == 1 || r.RoleID == 2 || r.RoleID == 3 ? ro.RoleName : null,
                  AdditionalRole = r.RoleID == 5  ? ro.RoleName : null
              }).ToList();

Хотелось бы узнать, как это можно сделать в SQL / LINQ.

1 Ответ

1 голос
/ 30 ноября 2010

ОБНОВЛЕНИЕ: я улучшил код, поэтому он будет выполнять всю работу в SQL вместо того, чтобы возвращать результаты и затем выполнять группирование.

Это должно сработать!

В ключевой части мы упорядочиваем строки по RoleID, а затем группируем строки по ID.Предполагается, что у вас есть только Роль и Дополнительная Роль, то есть он не будет выбирать Дополнительную Роль2 или Дополнительную Роль3 и т. Д. *

var empDetails = from u in ObjectContext.USERS 
                 join ed in ObjectContext.USERS_EMPLOYEE_DETAILS on u.UserID equals ed.UserID 
                 join r in ObjectContext.ROLES_FOR_USERS on u.UserID equals r.UserID 
                 join ro in ObjectContext.ROLES on r.RoleID equals ro.RoleID 
                 where (r.HospitalID == Context.CurrentUser.HIdentity.HospitalID) 
                 where(r.RoleID!= 4) 
                 select new Models.AdminModelSettings.EmployeeDetailsForGivenHospital 
                 { 
                     UserName = u.UserName, 
                     EmployeeId = ed.ID, 
                     EmployeeDesignation = ed.Designation, 
                     RoleID = r.RoleID, 
                     RoleName = r.RoleID == 1 || r.RoleID == 2 || r.RoleID == 3 ? ro.RoleName : null
                 });

var roleIDs = new List<int> { 1, 2, 3 };

//group our results and order the group by the role id
var temp = empDetails.GroupBy(row => row.ID).Select(g => new { First = g.FirstOrDefault(r => roleIDs.Contains(r.RoleID)), Last = g.FirstOrDefault(r => r.RoleID == 5) });

//select the data into the shape that we want
var query = temp.Select(result => new Models.AdminModelSettings.EmployeeDetailsForGivenHospital
{
    UserName = (result.First ?? result.Last).UserName,
    EmployeeId = (result.First ?? result.Last).ID,
    EmployeeDesignation = (result.First ?? result.Last).Designation,
    RoleID = (result.First == null) ? (int?)null : result.First.RoleID,
    AdditionalRoleID = (result.Last == null) ? (int?)null : result.Last.RoleID
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...