Linq Query из той же таблицы с несколькими условиями - PullRequest
0 голосов
/ 05 июля 2018

Мой текущий запрос, который я пытаюсь сделать,

 public async Task<ActionStatus<IList<SelectedListViewModel>>> GetProjectMembersByClient(Guid clientId)
    {
var userProjects = _unitofwork.UserProjects;
        var ProjectIds = userProjects.Get(filter: x => x.UserId == clientId).Select(y=> new UserProjects {UserId=y.UserId,ProjectId=y.ProjectId });
}

мой формат таблицы (имя таблицы: "UserProject")

MapId projectId UserID
1      123       89
2      123       69
3      123       36

Я хочу получить все идентификаторы пользователей, которые содержат один и тот же проект, когда я передаю идентификатор пользователя.

Например: если мой параметр 89 (соответствующий проект 123), я хочу получить 69 и 36 в качестве моей новой модели "UserProjects".

Примечание: идентификатор пользователя может иметь несколько проектов, в этом случае также необходимо получить всех участников из выбранного проекта

.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Вы можете получить такой набор данных с помощью Linq ниже.

var userIds = userProjects
    .GroupBy(m => m.ProjectId)
    .Where(g => g.Any(m => m.UserId == userId))
    .SelectMany(g => g.Select(m => m.UserId))
    .Distinct();

Это генерирует тот же результат, что и битовое решение + Distinct (). Тем не менее, я задавался вопросом, насколько они будут отличаться во время выполнения. Итак, я просто сравнил время обработки с обоими кодами для данных 10000 записей (генерируемых случайным образом каждый раз) 100 раз. В результате мое решение выше было примерно в 1,5 раза (или более) быстрее. Это результат по сравнению с моно 5.10.1.57 на macOS 10.13.5. Если производительность важна для вас, попробуйте ее в своей среде.

0 голосов
/ 05 июля 2018

Игнорирование опечаток и допущение, что userId и clientId являются числовыми. Сначала получите projectIds, что вам нужно,

var projectIds = _unitofwork.UserProjects.Where(p=>p.UserId==clientId).Select(p=>p.ProjectId);

и затем получите идентификаторы пользователей, связанные с этими projectIds; как то так:

var userIds = _unitofwork.UserProjects.Where(p=>projectIds.Contains(p.ProjectId)).Select(p=>p.UserId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...