首页 > 解决方案 > 将带有计数的嵌套 SQL 转换为 linQ

问题描述

我有一个包含员工列表的员工表。每个员工都有一个 ID、一个公司 ID、COR_N_ID 和一个母亲 MOTHER。MOTHER 字段实际上是另一个员工的 ID。一些员工有另一个员工附加到他们身上,在这种情况下,母亲字段被填写。否则它保留为空。员工可以附有一份员工名单,有些则没有。

我有一个 SQL 请求来获取没有附加员工的员工列表:

select *
from Employee a
where COR_N_ID = 99
and (select count(ID) from Employee b where b.MOTHER = a.ID) = 0;

但是,我坚持将其转换为 linQ。到目前为止我做了什么:

 var query = (from emp in Employee.FindAll(item => ( 
                         item.COR_N_ID == id 
                         ))
                         select new KeyValuePair
                         {
                             Key = business.Id.ToString(),
                             Value = business.CBA_CH_NAME
                         }
            );

请问有什么帮助吗?

我认为我们可以在这里删除 COR_N_ID 条件。

我只想要一份没有其他员工附属于他们的所有员工的名单。请注意,将员工链接到另一个员工的字段是 MOTHER 字段。

我试过这个:

var query = (from emp in Employee.FindAll(item => ( 
                         item.COR_N_ID == id 
                         ))
                         .where(item2 => !Employee.FindAll(item => item.MOTHER == business.ID))

                         select new KeyValuePair
                         {
                             Key = business.Id.ToString(),
                             Value = business.CBA_CH_NAME
                         }
            );

但这不起作用。

我有这个:

前

但我想要这个:

后

标签: c#sqlsql-serverlinq

解决方案


下面我将展示如何使用 LINQ 的扩展方法来做与子查询等效的事情(代码中的所有注释 :)):

public static void Main(string[] args)
{
  List<Employee> list = new List<Employee>();

  list = list
    // Here we are using equivalent of a subquery, but in order to include new column,
    // we use Tuple here. You can read about Tuples on Micsorosft pages and this site.
    // You can even name items in Tuple, but I leave it up to you.
    .Select(e => (e.ID, e.MOTHER, e.COR_N_ID, list.Count(innerEmployee => innerEmployee.MOTHER == e.ID)))
    // Now we can use result of our "subquery" in where method.
    .Where(e => e.Item4 == 0 && e.COR_N_ID == 99)
    .ToList();
}

// Sample class for presentation needs :)
public class Employee
{
  public int ID;
  public int MOTHER;
  public int COR_N_ID;
}

推荐阅读