【问题标题】:Some value return null on Dapper Multi MappingDapper Multi Mapping 上的某些值返回 null
【发布时间】:2016-04-21 16:16:36
【问题描述】:

我在使用 Dapper 时遇到问题。 我有一个包含valore 字段的Rubrica 类列表。 当我使用 JOIN 运行查询并确定议程类型时,valore 字段仍设置为 null

我的两个班RubricaTipoAgenda

public class Rubrica // Same as table anagrafico_rubrica
{
    public int id_rubrica { get; set; }
    public string cod_anagrafica { get; set; }
    public string descrizione_contatto { get; set; }
    public TipoRubrica tipo { get; set; }
    public string valore { get; set; }
}

public class TipoRubrica // Same as table anagrafico_tipo_rubrica
{
    public int id_tipo_rubrica { get; set; }
    public string descrizione_tipo_rubrica { get; set; }
}

我创建了一个函数,它返回给我一个 Agenda 列表,它与表 anagrafico_tipo_rubrica 进行 JOIN

    public List<Rubrica> GetAgendaAnagrafico(string codiceAnagrafico)
    {
        using (DatabaseConnection db = new DatabaseConnection())
        {
            const string query = @"SELECT * FROM anagrafico_rubrica JOIN anagrafico_tipo_rubrica ON tipo = id_tipo_rubrica WHERE cod_anagrafica = @anagrafico";
            var parametri = new { anagrafico = codiceAnagrafico };
            return db.con.Query<Rubrica, TipoRubrica, Rubrica>(query, (rubrica, tipo) => { rubrica.tipo = tipo; return rubrica; }, parametri, splitOn: "tipo").ToList();
        }
    }

在这里你可以看到查询返回的内容

在这里您可以看到Agenda 列表中valore 的值如何设置为null

【问题讨论】:

    标签: c# mysql dapper multi-mapping


    【解决方案1】:

    您在tipo 上进行拆分,它在您的查询中出现在valore 之前,因此dapper 正在拆分列并认为valoreTipoRubrica 而不是Rubrica

    在查询中明确选择字段的顺序

    SELECT id_rubrica, 
           cod_anagrafica, 
           descrizione_contatto, 
           valore, 
           tipo,       // <-- you are splitting here. columns above are for 
                       //     first type, columns below for second
           id_tipo_rubrica, 
           descrizione_tipo_rubrica 
        FROM ...
    

    因此,当您在 tipo 上拆分时,valore 在此之前,它映射到第一种类型 (Rubrica),而不是第二种 (TipoRubrica)

    【讨论】:

    • 试过了,有效!我认为 Dapper 可以理解哪个字段会根据类的名称自动关联值。
    • 按照惯例,它在Id 字段上拆分,但如果您明确告诉它在哪一列上拆分(在参数splitOn: "tipo" 上),它会按照您的命令执行;-)
    • 即使不是这样,明智的做法是(除非您有非常具体的不需要)在查询中明确选择您需要的字段,而不是使用SELECT * :-)
    • 是的,通常我只选择我感兴趣的字段,但在这种情况下它们都是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多