C# 如何在Dapper.Query中添加新的PropertyType()
我有一个名为Person的C类,在该类中,Person有一个类型为TelephoneDetails的电话属性 我正在尝试使用Dapper查询数据库,在我的查询中,我需要检索称为Detail的当前电话号码,并将其放入我的电话属性中 以下是我尝试过的:C# 如何在Dapper.Query中添加新的PropertyType(),c#,sql,sql-server,dapper,C#,Sql,Sql Server,Dapper,我有一个名为Person的C类,在该类中,Person有一个类型为TelephoneDetails的电话属性 我正在尝试使用Dapper查询数据库,在我的查询中,我需要检索称为Detail的当前电话号码,并将其放入我的电话属性中 以下是我尝试过的: var person = _connection.Query<Person>($"SELECT person AS Person, Detail AS {new TelephoneDetails{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时,我都会在电话属性中返回一个空值。如何从数据库获取数据并实例化属性
我觉得我已经给出了所需的一切,但如果没有,请使用评论部分进行澄清
提前感谢。答案是@Markeli和@Flydog57评论的集合 我解决了这个问题,为ReturnPerson和Telephone中需要的两个数据集创建了一个具有字符串属性类型的新类。需要注意的是Dapper使用了一种系统化的方法,因此记录集中的第一个类型应该与您检索的第一个人相匹配,并且应该按照以下顺序进行
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不是复杂的ORM,所以您不能:使用Dapper的最佳方法是创建一个POCO普通旧CLR对象,即一个只包含每个查询的公共属性getter和setter的类。属性应该与查询的列匹配。然后使用查询调用创建该类集合的实例