[英]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.