如何在 Dapper .Query<>() 中添加新的 PropertyType

Posted

技术标签:

【中文标题】如何在 Dapper .Query<>() 中添加新的 PropertyType【英文标题】:How to add a new PropertyType in Dapper .Query<>() 【发布时间】:2018-11-28 16:23:25 【问题描述】:

我有一个名为 Person 的 C# 类,在该类中,Person 有一个 Telephone 类型为 TelephoneDetails 的属性。

我正在尝试使用 Dapper 查询数据库,在我的查询中,我需要检索当前的电话号码(称为详细信息)并将其放入我的 Telephone 属性中。

这是我尝试过的:

    var person = _connection.Query<Person>($"SELECT person AS Person, Detail AS new TelephoneDetailsTelephone = "" " + // Here's my issue
                                                                  "FROM dbo.Foo WHERE PersonId = @id",
                                                                  new id).FirstOrDefault();

    return person;

每次我返回局部变量person 时,我都会在我的电话属性中返回一个空值。如何从数据库中获取数据实例化属性?

我觉得我已经提供了所需的一切,但如果没有,请使用 cmets 部分进行澄清。

提前致谢。

【问题讨论】:

Dapper 不是复杂的 ORM,所以你不能:***.com/questions/7508322/… 使用 Dapper 的最佳方式是为每个查询创建一个 POCO(Plain Old CLR Object,即仅包含公共属性 getter 和 setter 的类))。属性应与查询的列相匹配。然后,您使用 Query&lt;MyPocoClass&gt; 调用创建该类的集合的实例 【参考方案1】:

答案是@Markeli 和@Flydog57 cmets 的集合

我通过为我想要的两个数据集(PersonTelephone)创建一个具有string 属性类型的新类解决了这个问题。需要注意的重要一点是,Dapper 使用系统化方法,因此您在记录集 &lt;TFirst&gt; 中的第一个类型应该与您首先检索的内容 (Person) 匹配,这应该按照这个顺序贯穿始终。

public Person GetPersonDetails(int id)

    var person= _connection.Query<Person, TelephoneDetails, PersonDetailsRoot>(
        "SELECT p.* "/* TFirst */", td.* " +
        "FROM Person p " +
        "INNER JOIN TelephoneDetails td ON p.PersonContactId = td.ContactId " +
        "WHERE Id = @id",
        (person /* This is first to match the TFirst*/, details) => new PersonDetailsRoot // The new class made
        
            PersonName = person.Adviser,
            TelephoneNumber = detail.Detail
        ,
        new id,
        splitOn: "ContactId"
    ).ToList();

    if (!person.Any())
    
        return null;
    

    return new PersonDetails();

【讨论】:

以上是关于如何在 Dapper .Query<>() 中添加新的 PropertyType的主要内容,如果未能解决你的问题,请参考以下文章

使用Dapper时,如何将MySqlParameters[] 变成Dapper.DynamicParameters动态对象

Dapper中条件为In的写法

如何使用字符串作为参数遍历 Dapper 动态查询结果?

Dapper 返回反转日期格式

如何在 Dapper Query 的动态参数中传递多个条件,就像我们为 IN 运算符传递的一样

在 mvc 中使用 dapper 的动态结果