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

时间:2018-11-28 16:23:25

标签: c# sql sql-server dapper

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

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

这是我尝试过的:

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

    return person;

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

我觉得我已经提供了所有必要的信息,但如果没有,请使用注释部分进行澄清。

谢谢。

1 个答案:

答案 0 :(得分:1)

答案是@Markeli和@ Flydog57评论的集合

我通过为两个我想要返回的数据集(stringPerson)创建一个具有Telephone属性类型的新类,从而解决了这个问题。重要的是要注意,Dapper使用的是系统的方法,因此记录集<TFirst>中的第一种类型应与您首先要检索的内容(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();