次の形式の DataModel があります。
クラスA:
ID
日にち
List<B>
クラスB
名前
ID
のdataSetを返すDB spを呼び出します
A_Id, A_Date, B_Name, B_Id
この dataSet を type のオブジェクトにマップする最も読みやすい方法は何でしょうList<A>
か?
私は dataSet と DataReader を試しました - どちらも複雑に見えました
次の形式の DataModel があります。
クラスA:
ID
日にち
List<B>
クラスB
名前
ID
のdataSetを返すDB spを呼び出します
A_Id, A_Date, B_Name, B_Id
この dataSet を type のオブジェクトにマップする最も読みやすい方法は何でしょうList<A>
か?
私は dataSet と DataReader を試しました - どちらも複雑に見えました
単一のテーブルがあると仮定すると、Linq-to-DataTable を使用できます。
List<A> aList = dataTable.AsEnumerable()
.GroupBy(row => row.Field<int>("A_Id"))
.Select(grp => new A {
Id = grp.Key,
Name = grp.First().Field<DateTime>("A_Date"),
Bs = grp.Select(m => new B { Id = m.Field<int>("B_Id"), Name = m.Field<string>("B_Name") }).ToList(),
})
.ToList()
NHibernateのようなこの種のことを排除するORMツールを使用しない理由があると思います。もしそうなら、私はこれにデータリーダーを使用する傾向があります。複雑な私見ではなく、骨の折れる作業です。
リーダーを反復処理するときに変数の現在の値を追跡A.Id
し、変数の「現在の」インスタンスも保持しA
ます。リーダーの各行A.Id
が変更されている場合は、この現在の行A
を新しいインスタンスに設定し、リストに追加します。そして、リーダーの各行で、を作成し、B
それを現在A
ののList<B>
プロパティに追加します。
var result = new List<A>();
int currentId = -1;
A currentA;
while (reader.Read())
{
int id = reader.GetInt32(reader.GetOrdinal("A_Id"));
if (id != currentId)
{
currentId = id;
currentA = new A
{
Id = id,
Date= reader.GetDateTime(reader.GetOrdinal("A_Date")),
List = new List<B>()
};
result.Add(currentA);
}
currentA.List.Add(new B
{
Id = reader.GetInt32(reader.GetOrdinal("B_Id")),
Name = reader.GetString(reader.GetOrdinal("B_Name"))
};
}
後で読者を処分することを忘れないでください...