.NET Core 3.1中实现两表关联展示对应字段组合值的方法
需求实现:关联编码与描述并拼接展示
我使用.NET Core 3.1,需要实现以下效果:根据identification_produit表中Mentions_Danger字段的逗号分隔编码,关联phrases_clp表获取对应Phrase_Libelle,最终拼接成「编码:描述」的格式展示在同一单元格内。
现有代码
数据转换方法
private List<Phrases_Clp> PhrasesStringToListPhrases_Clp(string phrases_codes) { var listprhases = phrases_codes != null ? phrases_codes.Split(",") : new string[0]; return _context.Phrases_Clps.Where(x => listprhases.Contains(x.Phrase_Numero)).ToList(); }
Controller方法
//GET: EvaluationRisque/Create [Authorize(Roles = "Administrateur, Modificateur")] public async Task<IActionResult> Create() { Create_Viewbags(); var model = new EvaluationRisquesViewModel(); var produitUtiliseByProduitId = await _context.Identification_Produit.FirstOrDefaultAsync(); model.MentionsDanger = produitUtiliseByProduitId; model.List_Mentions_Danger = PhrasesStringToListPhrases_Clp(model.MentionsDanger.Mentions_Danger); return View(model); }
视图代码
<td> @foreach (var mention_danger in Model.List_Mentions_Danger) { <p> @mention_danger.Phrase_Numero : @mention_danger.Phrase_Libelle </p> } </td>
数据库表结构
identification_produit表
| Id | Mentions_Danger |
|---|---|
| 1 | H203,H204 |
| 2 | H203,H204,H205 |
| 3 | H201,H202,H203 |
phrases_clp表
| Phrase_Numero | Phrase_Libelle |
|---|---|
| H203 | Explosif; danger d'incendie, d'effet de souffle ou de projection |
| H204 | Danger d'incendie ou de projection |
| H201 | Explosif; danger d'explosion en masse |
期望输出
| Id | Mentions_Danger |
|---|---|
| 1 | H203:Explosif; danger d'incendie, d'effet de souffle ou de projection H204: Danger d'incendie ou de projection |
| 2 | H203:Explosif; danger d'incendie, d'effet de souffle ou de projection H204: Danger d'incendie ou de projection, H205:aaaaaaaaaaaaaa |
| 3 | H201:bbbbbbbbbbbbbb, H202:ccccccccccccccccccc, H203:ddddddddddddddd |
解决方案
1. 修复编码顺序问题
原方法返回的列表顺序可能和Mentions_Danger中的编码顺序不一致,修改数据转换方法确保结果顺序与原始编码一致:
private List<Phrases_Clp> PhrasesStringToListPhrases_Clp(string phrases_codes) { if (string.IsNullOrEmpty(phrases_codes)) return new List<Phrases_Clp>(); var codeList = phrases_codes.Split(","); // 获取匹配记录后按原始编码顺序排序 var matchedPhrases = _context.Phrases_Clps .Where(x => codeList.Contains(x.Phrase_Numero)) .ToList(); // 按原始编码顺序重新组织列表 return codeList .Select(code => matchedPhrases.FirstOrDefault(p => p.Phrase_Numero == code)) .Where(p => p != null) .ToList(); }
2. 拼接成目标格式展示
方式一:直接在视图中拼接(无缺失编码处理)
<td> @string.Join(" ", Model.List_Mentions_Danger.Select(m => $"{m.Phrase_Numero}:{m.Phrase_Libelle}")) </td>
方式二:视图中处理缺失编码
如果要兼容phrases_clp中不存在的编码(比如H205、H202),可以在视图中直接处理:
<td> @{ var codes = Model.MentionsDanger.Mentions_Danger?.Split(",") ?? Array.Empty<string>(); var phraseMap = Model.List_Mentions_Danger.ToDictionary(p => p.Phrase_Numero, p => p.Phrase_Libelle); } @string.Join(" ", codes.Select(c => phraseMap.ContainsKey(c) ? $"{c}:{phraseMap[c]}" : $"{c}:暂无描述")) </td>
方式三:ViewModel添加计算属性(视图更简洁)
在EvaluationRisquesViewModel类中添加计算属性:
public string FormattedMentions { get { if (MentionsDanger == null || string.IsNullOrEmpty(MentionsDanger.Mentions_Danger)) return string.Empty; var codes = MentionsDanger.Mentions_Danger.Split(","); var phraseMap = List_Mentions_Danger.ToDictionary(p => p.Phrase_Numero, p => p.Phrase_Libelle); return string.Join(" ", codes.Select(c => phraseMap.TryGetValue(c, out var libelle) ? $"{c}:{libelle}" : $"{c}:暂无描述")); } }
视图中直接使用:
<td>@Model.FormattedMentions</td>
内容的提问来源于stack exchange,提问作者Jérôme DE PORRES
相关产品推荐
相关产品推荐

