如何在 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<MyPocoClass>
调用创建该类的集合的实例
【参考方案1】:
答案是@Markeli 和@Flydog57 cmets 的集合
我通过为我想要的两个数据集(Person
和Telephone
)创建一个具有string
属性类型的新类解决了这个问题。需要注意的重要一点是,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();
【讨论】:
以上是关于如何在 Dapper .Query<>() 中添加新的 PropertyType的主要内容,如果未能解决你的问题,请参考以下文章
使用Dapper时,如何将MySqlParameters[] 变成Dapper.DynamicParameters动态对象