c# - 将带有计数的嵌套 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
}
);
但这不起作用。
我有这个:
但我想要这个:
解决方案
下面我将展示如何使用 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;
}
推荐阅读
- reactjs - 在回调时触发 PrimeReact Autocomplete 中的 completeMethod
- tensorflow - tf.keras.layers.BatchNormalization with trainable=False 似乎没有更新其内部移动均值和方差
- r - R:从一行中获取不同的变量并制作列标题
- regex - 为 Swagger 文档定义具有多个字符串模式的 Docket bean
- python - 在 Scrapy 中的元素之间抓取文本
- python - 从图像中提取 N 个补丁
- python - 导入maketrans
- c++ - 尝试使用 MinGW 编译时出错:无法执行 cc1plus
- html - 将登录详细信息从 VBA 发送到 HTML 弹出窗口
- java - 这种在 Java 中使用命令行参数的方式有什么问题?