代码之家  ›  专栏  ›  技术社区  ›  Bug

LINQ嵌套或内部查询

  •  3
  • Bug  · 技术社区  · 6 年前

    假设我有一个雇员列表,每个雇员都有几个项目。我可以让一个给定的员工使用:

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

    但是我如何为员工筛选项目呢?

    例如:

    var employee = list
      .SingleOrDefault(x => x.Key == employeeKey && 
                            x.Projects.SingleOrDefault(p => p.Key == projectKey));
    
    4 回复  |  直到 6 年前
        1
  •  2
  •   RedFox    6 年前

    如果你想过滤掉 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);
    

    无论哪种方法,都可以过滤员工和该员工的项目。

        2
  •  0
  •   Faizan khan    6 年前

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

        3
  •  0
  •   Rahul    6 年前

    使用 Any() 像LINQ方法

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

    此外,您正在根据员工ID进行筛选 x.Id== "id" 大多数情况下,员工ID将是一个主键(本质上是唯一的),在这种情况下,只需按 Id 我相信足够了

        4
  •  0
  •   Samy Sammour    6 年前

    如果找到或为空,则singleOrDefault返回对象。所以,在您的例子中,它返回所有员工,因为您没有测试任何东西。你刚才说如果项目在那里,那就把它还给我。

    如果存在或不存在将返回布尔值的任意值:

    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