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 關注
- 152 瀏覽
添加回答
舉報