Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从查询postgresql转换为linq C#_C#_Postgresql_Api_Linq_Asp.net Core - Fatal编程技术网

从查询postgresql转换为linq C#

从查询postgresql转换为linq C#,c#,postgresql,api,linq,asp.net-core,C#,Postgresql,Api,Linq,Asp.net Core,我想使用“groupby”和“string\u agg”来处理linq,但我无法从这个查询中找到引用 SELECT DISTINCT "TB_M_GROUP_EMP"."GROUP_ID" AS "ID", string_agg(Distinct "TB_M_EMPLOYEES"."EMP_NAME",',' order by "TB_M_EMPLOYEES"."

我想使用“groupby”和“string\u agg”来处理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"}|
谢谢。

退房:

items.Aggregate((i,j)=>i+分隔符+j));

这可能不会产生相同的SQL语句-因此您可能必须优化性能。

也许您可以使用LINQ键入:

var result =
        from employee in groupEmployee
        group employee by employee.GroupId into output
        select output;

现在你有了结果。为了回答您的问题,我使用了以下文章:

假设我们有以下模型:

公共类员工
{
public int EmployeeId{get;set;}
公共字符串代码{get;set;}
公共字符串名称{get;set;}
公共字符串电子邮件{get;set;}
}
公共类雇员组
{
公共int Id{get;set;}
public int GroupId{get;set;}
public int EmployeeId{get;set;}
}
请尝试以下方法:

var结果=组
.Join(员工,grp=>grp.EmployeeId,emp=>emp.EmployeeId,(集团,员工)=>
新的
{
group.GroupId,
employee.EmployeeId,
员工代码,
雇员姓名,
员工邮箱,
})
.GroupBy(res=>res.GroupId)
.选择(res=>new
{
GroupId=res.Key,
name=string.Join(“,”,res
.OrderBy(e=>e.Name)
。选择(e=>$“{e.Code},{e.Name},{e.Email}”))
})
.ToList();
然而,这里的另一个verson可能是(可能更接近您想要的输出):

var result=groups.GroupJoin(employees,grp=>grp.EmployeeId,emp=>emp.EmployeeId,
(grp、emp)=>新
{
grp.GroupId,
Names=string.Join(“,”,emp.Select(e=>$”{e.Code},{e.Name},{e.Email}”))
}).
GroupBy(e=>e.GroupId)
.ToList();
如果您希望为上述内容提供有序(按名称)版本,那么查询可能会变得更复杂一些:

var结果=组
.GroupJoin(员工、,
grp=>grp.EmployeeId,
emp=>emp.EmployeeId,
(grp、EMP)=>
{
var empsList=emps.ToList();
还新
{
grp.GroupId,
NamesCmp=empsList.Select(e=>e.Name).FirstOrDefault(),//这是订购所需的
Names=string.Join(“,”,empsList.Select(e=>$”{e.Code},{e.Name},{e.Email}”))
};
})
.GroupBy(e=>e.GroupId)
.选择(grp=>new
{
GroupId=grp.Key,
Items=grp.OrderBy(g=>g.NamesCmp)
.选择(g=>g.Names)
})
.ToList();


请注意,对于上述类型,最好使用真实类模型,而不是匿名类型。

根据我的理解,您正在寻找以下解决方案。如果我错过了什么,请告诉我

  • 首先根据EMP_ID连接两个表
  • 按组分组\u 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}\""))
                            });
    
    var result=(来自TB_M_EMPLOYEES.AsEnumerable()中的empRow)
    加入grpRow加入TB_M_GROUP_EMP.AsEnumerable()
    在empRow.Field上(“EMP_ID”)等于grpRow.Field(“EMP_ID”)
    选择新的
    {
    EMP_ID=empRow.Field(“EMP_ID”),
    EMP_代码=empRow.Field(“EMP_代码”),
    EMP_NAME=empRow.Field(“EMP_NAME”),
    EMP_EMAIL=empRow.Field(“EMP_EMAIL”),
    组ID=grpRow.字段(“组ID”)
    }).GroupBy(r=>r.GROUP\u ID)
    .选择(rs=>new
    {
    GroupId=rs.Key,
    FinalNames=string.Join(“,”,rs
    。选择(e=>$“\”{e.EMP\U代码}、{e.EMP\U名称}、{e.EMP\U电子邮件}\“”)
    });
    
    测试功能如下:

    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"),
                              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=新DataTable();
    TB_M_EMPLOYEES.Columns.Add(“EMP_ID”);
    TB_M_EMPLOYEES.Columns.Add(“EMP_代码”);
    TB_M_EMPLOYEES.Columns.Add(“EMP_NAME”);
    TB_M_EMPLOYEES.Columns.Add(“EMP_电子邮件”);
    DataTable TB_M_GROUP_EMP=新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();
    行[0]=“1”;
    行[1]=“E0012”;
    第[2]行=“阿里”;
    第[3]行=“@ali”;
    TB_M_EMPLOYEES.Rows.Add(row);
    row=TB_M_EMPLOYEES.NewRow();
    行[0]=“2”;
    行[1]=“E0013”;
    行[2]=“AL”;
    第[3]行=“@al”;
    TB_M_EMPLOYEES.Rows.Add(row);
    row=TB_M_EMPLOYEES.NewRow();
    行[0]=“3”;
    行[1]=“E0014”;
    行[2]=“Abi”;
    第[3]行=“@abi”;
    TB_M_EMPLOYEES.Rows.Add(row);
    row=TB_M_EMPLOYEES.NewRow();
    行[0]=“4”;
    行[1]=“E0015”;
    行[2]=“Ad”;
    第[3]行=“@ad”;
    TB_M_EMPLOYEES.Rows.Add(row);
    row=TB_M_EMPLOYEES.NewRow();
    行[0]=“5”;
    行[1]=“E0016”;
    行[2]=“Ea”;
    第[3]行=“@ea”;
    TB_M_EMPLOYEES.Rows.Add(row);
    row=TB_M_GROUP_EMP.NewRow();
    行[0]=“1”;
    行[1]=“1”;
    行[2]=“1”;
    TB_M_组_EMP.Rows.Add(row);
    row=TB_M_GROUP_EMP.NewRow();
    行[0]=“2”;
    行[1]=“1”;
    行[2]=“2”;
    TB_M_组_EMP.Rows.Add(row);
    row=TB_M_GROUP_EMP.NewRow();
    R