[英]What is the equivalent of XML PATH and Stuff in Linq lambda expression (GROUP_CONCAT/STRING_AGG)?
我有这样一张桌子:
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表达式吗?
我假设Lambda expression
是指Linq语句(例如,对于EF或Linq2Sql)。
显示的FOR XML PATH
和STUFF
示例是解决Sql Server中缺少GROUP_CONCAT
或LISTAGG
问题 。 最后在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
是Employee
和Items
之间连接的投影:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.