假设我有一个员工列表,每个员工都有几个项目。我可以使用以下方式来获得给定的员工:
var employee = employees.SingleOrDefault(x => x.Id == "id");
但是如何过滤员工的项目?
例如:
var employee = list
.SingleOrDefault(x => x.Key == employeeKey &&
x.Projects.SingleOrDefault(p => p.Key == projectKey));
答案 0 :(得分:2)
如果要在获得雇员后过滤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);
通过任何一种方式过滤员工和该员工的项目。
答案 1 :(得分:0)
var employee = employees.SingleOrDefault(
x => x.Id.Equals("id") && x.project.Equals("project")
);
答案 2 :(得分:0)
使用类似Any()
的LINQ方法
var employee = employees.SingleOrDefault(x => x.Id== "id" && x.Projects.Any(p => p.Id == "Id"));
此外,您正在基于员工ID x.Id== "id"
进行过滤,并且大多数情况下,员工ID将是主键(本质上是唯一键),在这种情况下,仅通过Id
进行过滤就足够了,我相信< / p>
答案 3 :(得分:0)
SingleOrDefault返回该对象(如果找到)或为null。因此,在您的情况下,它将返回所有员工,因为您没有进行任何测试。您只是说项目在那儿,然后返回它。
使用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实现它,但使用null测试值:
var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.SingleOrDefault(p => p.Key == projectKey) != null);
如果您希望返回类型更具体,请使用select。
如果它不起作用,请尝试在列表中添加“包括”:
list.Include("Projects").... the rest of the query