You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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表

IdMentions_Danger
1H203,H204
2H203,H204,H205
3H201,H202,H203

phrases_clp表

Phrase_NumeroPhrase_Libelle
H203Explosif; danger d'incendie, d'effet de souffle ou de projection
H204Danger d'incendie ou de projection
H201Explosif; danger d'explosion en masse

期望输出

IdMentions_Danger
1H203:Explosif; danger d'incendie, d'effet de souffle ou de projection H204: Danger d'incendie ou de projection
2H203:Explosif; danger d'incendie, d'effet de souffle ou de projection H204: Danger d'incendie ou de projection, H205:aaaaaaaaaaaaaa
3H201: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:54:21