c# - 从查询 postgresql 转换为 linq C#
问题描述
我想使用带有“string_agg”的“groupby”与 linq 一起工作,但我无法从此查询中找到参考。
SELECT DISTINCT "TB_M_GROUP_EMP"."GROUP_ID" AS "ID",
string_agg(Distinct "TB_M_EMPLOYEES"."EMP_NAME",',' order by "TB_M_EMPLOYEES"."EMP_NAME" ) as "Employee Name"
FROM public."TB_M_GROUP_EMP", "TB_M_EMPLOYEES"
GROUP BY "TB_M_GROUP_EMP"."GROUP_ID";
或此代码
SELECT DISTINCT "TB_M_GROUP_EMP"."GROUP_ID" as "Group Id", array_agg(Distinct"TB_M_EMPLOYEES"."EMP_CODE" || ',' ||"TB_M_EMPLOYEES"."EMP_NAME"|| ',' ||"TB_M_EMPLOYEES"."EMP_EMAIL" ) as "Employees"
FROM public."TB_M_GROUP_EMP", "TB_M_EMPLOYEES"
GROUP BY "TB_M_GROUP_EMP"."GROUP_ID";
请帮助将此查询转换为 linq C# 并提供参考或文档 linq!
我曾尝试使用此代码,但这并不是我想要的输出。
groupEmployee
.GroupBy(e => new { e.GroupId, e.Employee }, (key, group) => new
{
Employee = key.Employee,
Employees = group.ToList()
})
示例表:
--------------
TB_M_EMPLOYEES
--------------
|EMP_ID|EMP_CODE|EMP_NAME|EMP_EMAIL|
------------------------------------
|1 |E0012 |Ali |@ali |
|2 |E0013 |AL |@al |
|3 |E0014 |Abi |@abi |
|4 |E0015 |Ad |@ad |
|5 |E0016 |Ea |@ea |
----------------------
TB_M_GROUP_EMP
----------------------
|Id|GROUP_ID|EMP_ID|
----------------------
|1 |1 |1 |
|2 |1 |2 |
|3 |1 |3 |
|4 |1 |4 |
|5 |1 |5 |
从上面的两个表中。我希望输出是这个底部的表格。
TB_M_GROUP_EMP
-----------------
|GROUP_ID|EMP|
-----------------
|1 |{"E0012,Ali,@ali","E0013,Al,@al","E0014,Abi,@abi","E0015,Ad,@ad","E0016,Ea,@ea"}|
谢谢。
解决方案
假设我们有以下模型:
public class Employee
{
public int EmployeeId { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
public class EmployeeGroup
{
public int Id { get; set; }
public int GroupId { get; set; }
public int EmployeeId { get; set; }
}
试试看,下面:
var result = groups
.Join(employees, grp => grp.EmployeeId, emp => emp.EmployeeId, (group, employee) =>
new
{
group.GroupId,
employee.EmployeeId,
employee.Code,
employee.Name,
employee.Email,
})
.GroupBy(res => res.GroupId)
.Select(res => new
{
GroupId = res.Key,
Names = string.Join(",", res
.OrderBy(e => e.Name)
.Select(e => $"{e.Code},{e.Name},{e.Email}"))
})
.ToList();
然而,这里的另一个版本可能是(可能更接近你想要的输出):
var result = groups.GroupJoin(employees, grp => grp.EmployeeId, emp => emp.EmployeeId,
(grp, emp) => new
{
grp.GroupId,
Names = string.Join(",", emp.Select(e => $"{e.Code},{e.Name},{e.Email}"))
}).
GroupBy(e=> e.GroupId)
.ToList();
如果您想要上面的有序(按名称)版本,那么查询可能会变得更复杂一些:
var result = groups
.GroupJoin(employees,
grp => grp.EmployeeId,
emp => emp.EmployeeId,
(grp, emps) =>
{
var empsList = emps.ToList();
return new
{
grp.GroupId,
NamesCmp = empsList.Select(e => e.Name).FirstOrDefault(), // this needed for Ordering
Names = string.Join(",", empsList.Select(e => $"{e.Code},{e.Name},{e.Email}"))
};
})
.GroupBy(e => e.GroupId)
.Select(grp => new
{
GroupId = grp.Key,
Items = grp.OrderBy(g => g.NamesCmp)
.Select(g => g.Names)
})
.ToList();
请注意,对上述使用真实类模型而不是匿名类型更可取。
推荐阅读
- java - 使用时间概念实现地图
- html - 如何通过剪辑路径过渡保持悬停效果?
- ios - 在 iOS 上提示生物识别权限时:我是否需要要求启用 TouchID?
- python - 停止打印语句在 for 循环中重复
- maven - 如何仅重建一小部分具有直接依赖关系的 MVN 模块,而无需构建整个项目
- node.js - 有没有办法使用无头 puppeteer NodeJS 观看流
- python - Python中的优化问题
- active-directory - 如何将应用程序配置为 LDAP,以便只有特定组的用户才能登录?
- javascript - Discord.js 黑名单代码没有做任何事情
- git - 在 Rebase、Fetch 和 Reset 之后修改 Git 文件