Dee*_*ani 6 sql linq lambda substring for-xml-path
我有这样一张桌子:
EmployeeId  EmployeeName ItemName
4           Ganesh       Key Board
4           Ganesh       Processor
1           Jignesh      Key Board
1           Jignesh      Mouse
1           Jignesh      Processor
3           Rakesh       Key Board
2           Tejas        Key Board
2           Tejas        Mouse
2           Tejas        Processor
我需要查询这个,就好像itemname不同employeeid,employeename我们应该将项目分为','.
就像下面给出的那个:
EmployeeId  EmployeeName ItemName
1           Jignesh      Key Board, Mouse, Processor
2           Tejas        Key Board, Mouse, Processor
3           Rakesh       Key Board
4           Ganesh       Key Board, Processor
这是SQL查询:

任何人都可以帮助我将上述SQL查询转换为Lambda表达式吗?
Stu*_*tLC 13
我假设Lambda expression您的意思是Linq语句(例如,EF或Linq2Sql).
所述FOR XML PATH和STUFF所示的示例是要解决缺乏一个黑客GROUP_CONCAT或LISTAGG在SQL服务器.最后在Sql 2017中有STRING_AGG
您根本不需要在LINQ中重现hack  - 而只需将感兴趣的员工的所有行加载到内存中,GroupBy所需的密钥,然后String.Join在选择投影中使用:
var result = db.EmployeeItems
      // If you have a filter add the .Where() here ...
      .GroupBy(e => e.EmployeeId)
      .ToList()
      // Because the ToList(), this select projection is not done in the DB
      .Select(eg => new 
       {
          EmployeeId = eg.Key,
          EmployeeName = eg.First().EmployeeName,
          Items = string.Join(",", eg.Select(i => i.ItemName))
       });
在和employeeItems之间的连接投影在哪里:EmployeeItems
var employeeItems = new []
{
   new EmployeeItem{EmployeeId = 1, EmployeeName = "Ganesh", ItemName = "Keyboard"},
   new EmployeeItem{EmployeeId = 1, EmployeeName = "Ganesh", ItemName = "Mouse"},
   new EmployeeItem{EmployeeId = 2, EmployeeName = "John", ItemName = "Keyboard"}
};
结果:
1 Ganesh Keyboard,Mouse
2 John   Keyboard