1

次の形式の DataModel があります。

クラスA:

  • ID

  • 日にち

  • List<B>

クラスB

  • 名前

  • ID

のdataSetを返すDB spを呼び出します

A_Id, A_Date, B_Name, B_Id

この dataSet を type のオブジェクトにマップする最も読みやすい方法は何でしょうList<A>か?

私は dataSet と DataReader を試しました - どちらも複雑に見えました

4

2 に答える 2

1

単一のテーブルがあると仮定すると、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()
于 2012-05-28T10:50:04.367 に答える
0

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"))
        };
}

後で読者を処分することを忘れないでください...

于 2012-05-28T10:45:18.707 に答える