如何解决从查询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"}|
谢谢。
解决方法
退房:
https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.aggregate?view=netcore-3.1
例如。
items.Aggregate((i,j) => i + delimiter + j));
这可能不会产生相同的SQL语句-因此您可能必须针对性能进行优化。
,也许您可以使用LINQ键入:
var result =
from employee in groupEmployee
group employee by employee.GroupId into output
select output;
现在您得到了输出结果。为了回答您的问题,我使用了以下文章:https://docs.microsoft.com/en-gb/dotnet/csharp/linq/group-query-results
,假设我们有以下模型:
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,emp) => new
{
grp.GroupId,emp.Select(e => $"{e.Code},{e.Email}"))
}).
GroupBy(e=> e.GroupId)
.ToList();
如果您想要上面的订购(按名称)版本,则查询可能会变得更加复杂:
var result = groups
.GroupJoin(employees,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.Email}"))
};
})
.GroupBy(e => e.GroupId)
.Select(grp => new
{
GroupId = grp.Key,Items = grp.OrderBy(g => g.NamesCmp)
.Select(g => g.Names)
})
.ToList();
请注意,更可取的是使用实类模型代替 anonymous 类型。
,根据我的理解,您正在寻找以下解决方案。如果我错过了什么,请告诉我。
- 首先根据EMP_ID连接两个表
- 按GROUP_ID列分组。
- 使用string.Join加入$“” {e.EMP_CODE},{e.EMP_NAME},{e.EMP_EMAIL}“”。
下面是代码:
var result = (from empRow in TB_M_EMPLOYEES.AsEnumerable()
join grpRow in TB_M_GROUP_EMP.AsEnumerable()
on empRow.Field<string>("EMP_ID") equals grpRow.Field<string>("EMP_ID")
select new
{
EMP_ID = empRow.Field<string>("EMP_ID"),EMP_CODE = empRow.Field<string>("EMP_CODE"),EMP_NAME = empRow.Field<string>("EMP_NAME"),EMP_EMAIL = empRow.Field<string>("EMP_EMAIL"),GROUP_ID = grpRow.Field<string>("GROUP_ID")
}).GroupBy(r => r.GROUP_ID)
.Select(rs => new
{
GroupId = rs.Key,FinalNames = string.Join(",rs
.Select(e => $"\"{e.EMP_CODE},{e.EMP_NAME},{e.EMP_EMAIL}\""))
});
测试功能如下:
static void PostResSql()
{
DataTable TB_M_EMPLOYEES = new DataTable();
TB_M_EMPLOYEES.Columns.Add("EMP_ID");
TB_M_EMPLOYEES.Columns.Add("EMP_CODE");
TB_M_EMPLOYEES.Columns.Add("EMP_NAME");
TB_M_EMPLOYEES.Columns.Add("EMP_EMAIL");
DataTable TB_M_GROUP_EMP = new DataTable();
TB_M_GROUP_EMP.Columns.Add("Id");
TB_M_GROUP_EMP.Columns.Add("GROUP_ID");
TB_M_GROUP_EMP.Columns.Add("EMP_ID");
DataRow row = TB_M_EMPLOYEES.NewRow();
row[0] = "1";
row[1] = "E0012";
row[2] = "Ali";
row[3] = "@ali";
TB_M_EMPLOYEES.Rows.Add(row);
row = TB_M_EMPLOYEES.NewRow();
row[0] = "2";
row[1] = "E0013";
row[2] = "AL";
row[3] = "@al";
TB_M_EMPLOYEES.Rows.Add(row);
row = TB_M_EMPLOYEES.NewRow();
row[0] = "3";
row[1] = "E0014";
row[2] = "Abi";
row[3] = "@abi";
TB_M_EMPLOYEES.Rows.Add(row);
row = TB_M_EMPLOYEES.NewRow();
row[0] = "4";
row[1] = "E0015";
row[2] = "Ad";
row[3] = "@ad";
TB_M_EMPLOYEES.Rows.Add(row);
row = TB_M_EMPLOYEES.NewRow();
row[0] = "5";
row[1] = "E0016";
row[2] = "Ea";
row[3] = "@ea";
TB_M_EMPLOYEES.Rows.Add(row);
row = TB_M_GROUP_EMP.NewRow();
row[0] = "1";
row[1] = "1";
row[2] = "1";
TB_M_GROUP_EMP.Rows.Add(row);
row = TB_M_GROUP_EMP.NewRow();
row[0] = "2";
row[1] = "1";
row[2] = "2";
TB_M_GROUP_EMP.Rows.Add(row);
row = TB_M_GROUP_EMP.NewRow();
row[0] = "3";
row[1] = "1";
row[2] = "3";
TB_M_GROUP_EMP.Rows.Add(row);
row = TB_M_GROUP_EMP.NewRow();
row[0] = "4";
row[1] = "1";
row[2] = "4";
TB_M_GROUP_EMP.Rows.Add(row);
row = TB_M_GROUP_EMP.NewRow();
row[0] = "5";
row[1] = "1";
row[2] = "5";
TB_M_GROUP_EMP.Rows.Add(row);
var result = (from empRow in TB_M_EMPLOYEES.AsEnumerable()
join grpRow in TB_M_GROUP_EMP.AsEnumerable()
on empRow.Field<string>("EMP_ID") equals grpRow.Field<string>("EMP_ID")
select new
{
EMP_ID = empRow.Field<string>("EMP_ID"),{e.EMP_EMAIL}\""))
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。