Как объединить запросы linq и выбрать разные записи? - PullRequest
0 голосов
/ 26 марта 2012

У меня есть объект, которому можно назначить одного пользователя или рабочую группу.Пользователь может быть назначен напрямую или через рабочую группу, но объект никогда не может быть установлен обоими.

public class Procedure
{
      .....
      public Guid? AssignedToId {get;set;} //Foreign Key to AssignedTo
      public Contact AssignedTo {get;set;} //Single user assignment
      public Guid? AssignedWorkGroupId {get;set;} //Foreign Key to AssignedWorkGroup
      public WorkGroup AssignedWorkGroup {get;set;} //Multiple user assignment
      public Guid? AssignedBuisnessPartnerId {get;set;}
      public BusinessPartner AssignedBuisnessPartner {get;set;}

}

Я пытаюсь выяснить, как написать один запрос, в котором я могу найти процедуры, в которых пользователь может быть назначен напрямую или входит в назначенную рабочую группу.В настоящее время у меня есть 2 отдельных запроса и объединение списков, которые я получаю.Что работает, но, вероятно, не так эффективно.

Вот что у меня сейчас:

var procedures =  _procedureRepository.Get(p => p.AssignedToId == assignedId).ToList();

procedures.AddRange(_procedureRepository.Get(p => p.AssignedWorkGroup.Contacts.Select(c => c.Id).Contains(assignedId) || p.AssignedBuisnessPartner.Contacts.Select(c => c.Id).Contains(assignedId));

1 Ответ

1 голос
/ 26 марта 2012

Похоже, вы ищете Union All в sql, что эквивалентно Concat в linq.Следующий код будет выполнять только один вызов базы данных.Не уверен, что это будет быстрее, чем ваш текущий метод.

var procedures2 = _procedureRepository.Get(p => p.AssignedWorkGroup.Contacts
                                                                   .Select(c => c.Id)
                                                                   .Contains(assignedId) || 
                                                p.AssignedBuisnessPartner.Contacts
                                                                         .Select(c => c.Id)
                                                                         .Contains(assignedId));

var procedures = _procedureRepository.Get(p => p.AssignedToId == assignedId)
                                     .Concat(procedures2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...