Dapper多重映射中有些值返回null

5

我在使用 Dapper 时遇到了问题。我有一个包含字段 valoreRubrica 类的列表。当我运行带有 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; }
}

我创建了一个函数,通过与表anagrafico_tipo_rubrica进行JOIN操作,返回一个Agenda列表。
    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

'valore'的值为null

1个回答

7
您正在按照查询中tipo之前的位置进行拆分,因此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可以根据类名自动关联字段值。 - Lorenzo Belfanti
1
按照惯例,它会在“Id”字段上进行拆分,但是如果您明确告诉它要在哪一列上拆分(在参数“splitOn:“tipo””上),它将按照您的命令执行。;-) - Jcl
即使不是这种情况,明智的做法(除非您有非常特定的需求)是显式地选择查询中所需的字段,而不是使用 SELECT * :-) - Jcl
是的,通常我只选择我感兴趣的字段,但在这种情况下它们全部都是。 - Lorenzo Belfanti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接