POCO モデルで外部キーと子コレクションを公開しないと、Dapper で問題が発生します。2 つのエンティティを使用した簡単な例を見てみましょう。
Bike (Id, ModelName)
Tire (Id, Tread)
データベースでは、各 Tire に Bike への外部キーがあります。しかし、私のモデルはそうではありません。データベースから、この構造をDictionary<Bike, IEnumerable<Tire>>
. 各バイク (固有) には 2 つのタイヤがあります。
次のクエリを使用して、この 1 対多の関係を選択できます。
SELECT b.Id, b.ModelName, t.Id, t.Tread
FROM Bike b
JOIN Tire t ON b.Id = t.bike_id
Dapper を使用してそれをマッピングするために、次のことを行いました。
var dbResult = connection.Query<Bike, Tire, KeyValuePair<Bike, Tire>>("sql-query-above",
(a, s) => new KeyValuePair<Bike, Tire>(a, s);
splitOn: "Id");
そして、LINQ を使用して、その結果を辞書に変換します。
Dictionary<Bike, IEnumerable<Tire>> dict = dbResult.GroupBy(g => g.Key, g => g.Value).ToDictionary(g => g.Key, g => g.AsEnumerable());
そして、データ構造を正しく返します。
Bike #1
- Tire #1
- Tire #2
Bike #2
- Tire #3
- Tire #4
しかし、これはこのデータ構造を具現化する最も効率的な方法でしょうか? 別の方法としては、ディクショナリを使用せず、外部キーと関係を公開する他のエンティティを作成し (例: Bike の Tires コレクションと Tire の FK)、ここで説明されているようなマッピング アプローチを使用します。しかし、多くの余分なクラスが発生するため、私のモデルではそれを避けたいと思います。しかし、パフォーマンスはどうですか?これは悪いですか、それとも同じですか?