Внешнее объединение в linq и получение записей на основе условия из второй таблицы - PullRequest
0 голосов
/ 03 мая 2018
Tables : 
Component        ComponentRights
--------------        ----------------  
ComponentId (PK)      ComponentRightsID
ComponentName         ComponentId (FK)
                      RoleId 

Допустим, MyRoleId = 2;

Теперь я хочу получить все записи из обеих таблиц, но основываясь на одном условии. Если я получаю одну и ту же запись, но с другим RoleId, тогда должна быть только одна запись, где RoleId = MyRoleId. Если дубликатов нет, условие пропускается.

Example:
Record 1:
------------
ComponentId = 1,
ComponentName = 'SampleComponent'
RoleId = 1

Record 2 :
-----------
ComponentId = 1,
ComponentName = 'SampleComponent'
RoleId = 2

* So In this case I should get Record 2.

Here is my sample code:



var Components = (from components in MyDB.Component
                                  join componentRights in MyDB.ComponentRights on components.ComponentId equals componentRights.ComponentId
                                  into AllComponents
                                  from allComponent in AllComponents.DefaultIfEmpty()

                                  where !(components.IsDeleted)

                                  select new ComponentRightsModel()
                                  {

                                      ComponentRightsId = (!allComponent.IsDeleted) ? (Guid?)allComponent.ComponentRightsId : null,
                                      ComponentId = components.ComponentUID,
                                      ComponentName = components.ComponentName,
                                      RoleId = allComponent.RoleId
                                  }).ToList();

1 Ответ

0 голосов
/ 03 мая 2018

Я бы предложил разложить проблему на отдельные утверждения ...

var Components = (from components in MyDB.Component
                  join componentRights in MyDB.ComponentRights on components.ComponentId equals componentRights.ComponentId
                                  into AllComponents
                                  from allComponent in AllComponents.DefaultIfEmpty()

                              where !(components.IsDeleted)
                              select new ComponentRightsModel()
                              {
                                  ComponentRightsId = (!allComponent.IsDeleted) ? (Guid?)allComponent.ComponentRightsId : null,
                                  ComponentId = components.ComponentUID,
                                  ComponentName = components.ComponentName,
                                  RoleId = allComponent.RoleId
                              });
var uniqueComponetIds = Components.GroupBy(x=>x.ComponentId).Select(x=> new {ComponentId = x.Key, Count = x.Count(y=>y.RoleId)}).Where(x=>x.Count == 1).Select(x=>x.ComponentId);

var filteredDuplicates = Components.Where(x=> !uniqueComponetIds.Contains(x.ComponentId) && x.RoleId == MyRoleId);

var finalComponents = Components.Where(x=> uniqueComponetIds.Contains(x.ComponentId).Concat(filteredDuplicates);

Обратите внимание, что этот запрос также будет отфильтровывать записи, в которых дублируется компонент, но где скопированный дубликат не имеет роли с RoleId == MyRoleId. Если вы также хотите включить их, вы можете добавить третий оператор, чтобы зафиксировать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...