Linq вложенный или внутренний запрос - PullRequest
0 голосов
/ 20 ноября 2018

Предположим, у меня есть список сотрудников, и у каждого сотрудника есть несколько проектов.Я могу получить данного сотрудника, используя:

var employee = employees.SingleOrDefault(x => x.Id == "id");

Но как я могу отфильтровать и проект для сотрудника?

Например:

var employee = list
  .SingleOrDefault(x => x.Key == employeeKey && 
                        x.Projects.SingleOrDefault(p => p.Key == projectKey));

Ответы [ 4 ]

0 голосов
/ 20 ноября 2018

SingleOrDefault возвращает объект, если он найден или равен нулю. Итак, в вашем случае он возвращает всех сотрудников, потому что вы ничего не тестируете. Вы только что сказали, что если проект есть, верните его.

Вместо этого используйте Any, который будет возвращать логическое значение, если существует или нет:

var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.Any(p => p.Key == projectKey));

Если вам нужно отфильтровать, если у него есть только один проект с определенным ключом:

var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.Count(p => p.Key == projectKey) == 1);

Вы также можете достичь этого с помощью SingleOrDefault, но протестируйте значение с нулем:

var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.SingleOrDefault(p => p.Key == projectKey) != null);

Если вы хотите, чтобы тип возвращаемого значения был более конкретным, используйте select.

Если это не сработало, попробуйте добавить «include» в список:

list.Include("Projects").... the rest of the query
0 голосов
/ 20 ноября 2018

Использовать Any() Метод LINQ, такой как

var employee = employees.SingleOrDefault(x => x.Id== "id" && x.Projects.Any(p => p.Id == "Id"));

Более того, Вы фильтруете на основе идентификатора сотрудника x.Id== "id", и в основном этот идентификатор сотрудника будет первичным ключом (уникальным по своей природе), и в этом случае фильтрацияпросто Id было бы достаточно, я считаю

0 голосов
/ 20 ноября 2018

Если вы хотите отфильтровать Projects после получения сотрудника, вы можете использовать .Select().

var result = employees.Where(e => e.Id == id).Select(e => new Employee
            {
                Id = e.Id,
                Projects = e.Projects.SingleOrDefault(p => p.Key == projectKey)
            }).SingleOrDefault();

. Таким образом, вы можете получить необходимые данные за один шаг, но вы должныприсвойте свойства самостоятельно.

Другой способ - сначала получить свой Employee, а затем отфильтровать проекты, как предложено BoredomOverload:

var employee = employees.SingleOrDefault(x => x.Id== "id");
employee.Projects = employee.Projects.SingleOrDefault(p => p.Key == projectKey);

В любом случае вы получите сотрудника иПроекты этого сотрудника отфильтрованы.

0 голосов
/ 20 ноября 2018

var employee = employees.SingleOrDefault( x => x.Id.Equals("id") && x.project.Equals("project") );

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