如何将指定SQL聚合查询转换为LINQ语句实现数据库记录查询
将SQL分组拼接逻辑转换为LINQ实现
原SQL功能说明
原SQL通过按植物名称(对应表中Item字段)、学名(对应表中Botanical Name字段)分组,将同一类植物的不同种植地点(对应表中Location字段)去重后拼接成字符串,同时生成Item字段为名称与学名的拼接结果。
表结构(planting表)
| Id | Item | Botanical Name | Location |
|---|---|---|---|
| 1 | Apple | Malus spp | Block C |
| 2 | Coffee | Coffea | Block A |
| 3 | Coffee | Coffea | Block B |
| 4 | Apple | Malus spp | Block B |
预期输出
| Id | Item | Location |
|---|---|---|
| 1 | Apple, Malus spp | Block C, Block B |
| 2 | Coffee, Coffea | Block A, Block B |
LINQ实现代码
修改原框架代码,通过分组+字符串拼接实现对应逻辑:
public IActionResult UrlDatasource([FromBody] DataManagerRequest dm) { // 分组并处理拼接逻辑 var dataSource = _context.planting .GroupBy(p => new { p.Item, p.BotanicalName }) // 按Item和BotanicalName分组,对应原SQL的分组逻辑 .Select((group, index) => new { Id = index + 1, // 生成自增Id Item = $"{group.Key.Item}, {group.Key.BotanicalName}", Location = string.Join(", ", group.Select(p => p.Location).Distinct()) // 去重后拼接地点 }) .ToList(); DataOperations operation = new DataOperations(); return dm.RequiresCounts ? Json(new { result = dataSource }) : Json(dataSource); }
代码说明
- 分组逻辑:通过
GroupBy按Item和BotanicalName分组,对应原SQL的GROUP BY Name, Variety, Botanical。 - 拼接处理:
Item字段直接拼接分组键的Item和BotanicalName,对应原SQL的CONCAT(Name, ', ', Variety)。Location字段通过string.Join拼接分组内去重后的Location值,对应原SQL中STUFF+子查询的拼接逻辑。
- 自增Id:通过分组的索引生成预期输出中的自增Id。
内容的提问来源于stack exchange,提问作者Ken John
相关产品推荐
相关产品推荐

