forked from alexandervaartjes/Dapper
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMultiMapping Dapper
More file actions
152 lines (118 loc) · 3.94 KB
/
Copy pathMultiMapping Dapper
File metadata and controls
152 lines (118 loc) · 3.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// 📝 STAP-VOOR-STAP UITLEG: Dapper Multi Mapping
/*
🎯 DOEL:
Gegevens uit meerdere tabellen combineren in objecten die aan elkaar gekoppeld zijn.
Bijv: Product bevat een Category-object.
========================
🔢 STAPPENPLAN
========================
1️⃣ Schrijf een JOIN-query die data haalt uit meerdere tabellen
--------------------------------------------------------------
Bijv:
SELECT p.ProductID, p.ProductName,
'' AS CategorySplit, <-- marker voor splitOn
c.CategoryID, c.CategoryName
FROM Products p
JOIN Categories c ON p.CategoryID = c.CategoryID
2️⃣ Voeg een 'scheidingskolom' toe (splitOn marker)
---------------------------------------------------
Gebruik een fictieve kolomnaam in je SELECT:
'' AS CategorySplit
Waarom?
Dapper weet niet vanzelf waar Product eindigt en Category begint.
Deze kolom helpt Dapper de grens herkennen.
3️⃣ Gebruik Dapper’s Query<> met meerdere types
-----------------------------------------------
Gebruik:
Query<Product, Category, Product>()
De betekenis van de generieke types:
- Eerste: objecttype vóór de split (Product)
- Tweede: objecttype ná de split (Category)
- Derde: het type dat je terug wilt krijgen (ook Product)
4️⃣ Schrijf een mapping-functie
-------------------------------
map: (product, category) =>
{
product.Category = category;
return product;
}
Deze functie combineert de twee objecten (Product + Category).
5️⃣ Geef de splitOn-kolomnaam door
----------------------------------
splitOn: "CategorySplit"
Deze naam moet exact overeenkomen met de kolomnaam in je SELECT-statement.
6️⃣ Zet het resultaat om naar een lijst
---------------------------------------
Bijv:
.ToList()
Volledig voorbeeld:
var result = connection.Query<Product, Category, Product>(
sql,
map: (product, category) =>
{
product.Category = category;
return product;
},
splitOn: "CategorySplit"
).ToList();
========================
📌 EXTRA TIPS
========================
✅ Zorg dat de kolommen in de SELECT exact dezelfde volgorde hebben als de objecttypes in Query<>
✅ Als je splitOn vergeet of fout typt, krijg je rare null-objecten of fouten
✅ Je mag ook een echte kolomnaam gebruiken als splitOn, bijv. "CategoryID"
✅ splitOn hoeft GEEN lege string te zijn — als je weet waar het tweede object begint (bijv. CategoryID), gebruik dat
========================
🧠 Samengevat
========================
Dapper multi mapping:
- Combineert data uit meerdere tabellen
- Vereist splitOn om objectgrens aan te geven
- Gebruikt een mapping-functie om objecten te koppelen
Perfect voor relaties zoals:
- Product → Category
- Order → Customer
- BlogPost → Author
*/
// 📝 Aantekeningen Dapper Multi Mapping
/*
🔧 DOEL:
- Data ophalen uit meerdere tabellen (bijv. Products + Categories)
- Die data mappen naar gekoppelde objecten (Product bevat een Category)
💡 Gebruik:
Query<TFirst, TSecond, TResult>(
string sql,
Func<TFirst, TSecond, TResult> map,
string splitOn
)
🧩 splitOn:
- Nodig om Dapper te vertellen waar de 2e tabel begint
- Moet overeenkomen met de kolomnaam waar het 2e object begint
- Tip: gebruik '' as CategorySplit om duidelijk te scheiden
🛠️ Mapping:
map: (product, category) =>
{
product.Category = category;
return product;
}
🧪 Voorbeeld query:
SELECT p.ProductID, p.ProductName,
'' as CategorySplit,
c.CategoryID, c.CategoryName
FROM Products p
JOIN Categories c ON p.CategoryID = c.CategoryID
🧾 Complete voorbeeld:
var result = connection.Query<Product, Category, Product>(
sql,
map: (product, category) =>
{
product.Category = category;
return product;
},
splitOn: "CategorySplit"
).ToList();
📌 Belangrijk:
- Volgorde van velden in SELECT moet overeenkomen met volgorde van generieke types
- splitOn MOET een kolomnaam zijn die in de SELECT voorkomt
- Meerdere joins? Gebruik meerdere generieke types en grotere mapping-functies
*/