Фильтрация один ко многим в LINQ to Entities - PullRequest
0 голосов
/ 05 января 2019

У меня есть простой один ко многим между сотрудниками и навыками

var bob = new Employee
        {
            Name = "Bob",
            Title = "Senior Developer",
            Skills = new Collection<string> { "ASP.NET", "C#", "JavaScript", "SQL", "XML" }
        };

        var sam = new Employee
        {
            Name = "Sam",
            Title = "Developer",
            Skills = new Collection<string> { "ASP.NET", "C#", "Oracle", "XML" }
        };

var employees = new List<Employee> { bob, sam };

Target

Мне нужны все сотрудники со всеми навыками, НО C # one.

Попытка

Это json, который я получаю, когда просто возвращаю сотрудников с помощью метода веб-API

[
  {
    "title": "Senior Developer",
    "name": "Bob",
    "skills": [
      "ASP.NET",
      "C#",
      "JavaScript",
      "SQL",
      "XML"
    ]
  },
  {
    "title": "Developer",
    "name": "Sam",
    "skills": [
      "ASP.NET",
      "C#",
      "Oracle",
      "XML"
    ]
  }
]

Моя цель JSON будет

[

  {
    "title": "Senior Developer",
    "name": "Bob",
    "skills": [
      "ASP.NET",
      "JavaScript",
      "SQL",
      "XML"
    ]
  },
  {
    "title": "Developer",
    "name": "Sam",
    "skills": [
      "ASP.NET",
      "Oracle",
      "XML"
    ]
  }
]

Я попытался выполнить selectMany, но затем я потерял родительского сотрудника. Я попытался использовать перегрузку селектора результатов для select many, но тогда нужное вложение Employee потеряно в json.

Если я выполню это

var skills = employees
            .SelectMany(e => e.Skills, (e, s) => new { e.Name, s })
            .Where(empAndSkill => !empAndSkill.s.Equals("C#"));

Это JSON, который я получаю

[
  {
    "name": "Bob",
    "s": "ASP.NET"
  },
  {
    "name": "Bob",
    "s": "JavaScript"
  },
  {
    "name": "Bob",
    "s": "SQL"
  },
  {
    "name": "Bob",
    "s": "XML"
  },
  {
    "name": "Sam",
    "s": "ASP.NET"
  },
  {
    "name": "Sam",
    "s": "Oracle"
  },
  {
    "name": "Sam",
    "s": "XML"
  }
]

Очевидно, не то, чего я пытаюсь достичь. Моя цель кажется тривиальной, но решение, которое я пытаюсь найти, выглядит сложным, что напоминает мне, что, возможно, я что-то упускаю или делаю что-то не так. Я только начал с LINQ to Entities месяц назад.

Любая помощь?

1 Ответ

0 голосов
/ 05 января 2019

Вам нужно отфильтровать C # из соответствующей коллекции для каждого сотрудника. Ниже мы просто делаем прогноз каждого сотрудника на нового сотрудника, отфильтровавшего C # из ее навыков.

var employeesWithCSharpFilteredOut = 
           employees.Select(employee => new Employee
           {
               Name = employee.Name,
               Title = employee.Title,
               Skills = employee.Skills
                                .Where(skill => !string.Equals(skill,"C#",StringComparison.InvariantCultureIgnoreCase))
                                .ToList()
           }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...