繁体   English   中英

在 LINQ to Entities 中过滤一对多

[英]Filtering one to many in LINQ to Entities

我在员工和技能之间有一个简单的一对多

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 };

目标

我需要拥有所有技能的所有员工,但 C# 之一。

尝试

这是我刚从 web api 方法返回员工时得到的 json

[
  {
    "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。

有什么帮助吗?

您需要的是从每个员工的相应集合中过滤掉 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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM