モデル内の子コレクションや外部キーを公開せずに1対多数

c# dapper orm

質問

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

しかし、これはこのデータ構造を実現する最も効率的な方法ですか?代わりに、辞書を避けて、外部キーと関係を公開する他のエンティティ(たとえば、TireのBikeとFKのTiresコレクション)を作成し、 ここで説明するようなマッピング方法を使用することもできます 。しかし、私はそれがたくさんの余分なクラスをもたらすので私のモデルでそれを避けたいです。しかし、パフォーマンスはどうですか?これは悪化するか同じですか?

人気のある回答

私はDapperを使用する上で専門家ではありませんが、私は経験しているような制限があります。私のオブジェクトのプロパティの1つがあなたのタイヤのようなコレクションだったのと同じような状況でした。 2番目のクエリを作成して、コレクションの内部型に拡張メソッドを設定する方が簡単だったことが分かりました。

だから、最初にすべての自転車をつかんで、あなたの拡張方法を呼んでタイヤのデータをつかむようにしてください:

dict.WithTires();    

私はデータベースへの2回目の呼び出しを知っていますが、毎回タイヤ情報を取得しなくても自転車をつかむことができます。

また、バイクのクラスにタイヤコレクションを追加して、IMHOが辞書よりも優れていると考えるかもしれません。このようなものがあれば:

public class Bike
{
    public int id { get; set; }
    public string modelName { get; set; }
    public IList<Tires> tires { get; set; }
}

public class Tires
{
    public int id { get; set; }
    public string tread { get; set; }
}

個々の自転車または自転車のコレクションのタイヤデータを取得するための拡張方法を簡単に作成できます。

Bike myBike = new Bike();
List<Bike> bikeCollection = new List<Bike>();

myBike.WithTires();
bikeCollection.WithTires();


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow