2 回答
TA贡献1847条经验 获得超11个赞
好吧,想通了。两件事情:
首先, splitOn 是实现此目的的方法。一个不同但相关的最终版本如下所示:
return connection.Query<Program,
AssistanceProgramCategory,
AssistanceProgramType,
AssistanceProgramLegalType,
ProgramAuthority,
Program>(sql: Constants.SqlStatements.SELECT_PROGRAMS_SQL,
(program, category, programType, legalType, authority) =>
{
program.AssistanceCategory = category;
program.ProgramType = programType;
program.ProgramLegalType = legalType;
program.Authority = authority;
return program;
}, splitOn: "Name,Jurisdiction");
其中 AssistanceProgramCategory、AssistanceProgramType 和 AssistanceProgramLegalType 都是 Enumeration 的子项。
其次,SQL 必须提供带有名称的列,如下所示:
SELECT global_id as GlobalId
,tier
,program_description as Name
,program_type as Name
,program_legal_type as Name
,jurisdiction as Jurisdiction
,customer_id as CustomerId
,program_name as ProgramNameForJurisdiction
,program_description as ProgramName
FROM public.assistance_programs
第三,我只需要将“Name”放入 splitOn 一次 - Name 的每个实例都会导致创建一个新对象。
最后,我必须交换 Jurisdiction 和 CustomerId,因为 CustomerId 可以为 null,并且当为 NULL 时,它不会将最终的水合激发到 ProgramAuthority 中。管辖权始终存在,因此通过交换 SQL 中的列来解决问题。
TA贡献1802条经验 获得超10个赞
也许这太简单了,但是,您选择的列名需要与您要映射到的类中的属性相匹配,否则 Dapper 将不知道如何使映射匹配。
所以如果你的班级是:
public class Person
{
public Race Race {get;}
public Guid PersonId {get;}
}
那么您的查询需要匹配:
return connection.Query<Person>(sql: @"
SELECT
Race
, person_id as PersonId
FROM public.people");
请注意 Race 上的大写 R。(为了更好地衡量,我也喜欢让它们保持相同的顺序,尽管我不确定这是否重要。)
除此之外,如果您直接对数据库执行查询,您会得到您期望的结果吗?
- 2 回答
- 0 关注
- 117 浏览
添加回答
举报