2012-05-28 135 views
1

我有以下形式的的DataModel:映射DB數據列表的列表

A類:

  • 標識

  • 日期

  • List<B>

B類

  • 名稱

  • 標識

我invole DB SP返回的

A_Id, A_Date, B_Name, B_Id

數據集什麼是映射的最易讀的方式將此數據集設置爲類型爲的對象?

我試過的數據集和DataReader - 似乎都複雜

+0

目前尚不清楚,從你的質疑A和B如何相關。 –

+0

已修復。形式已經過時了 –

回答

1

假設你有一個表,你可以使用LINQ到數據表:

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() 
0

我假設你有沒有使用ORM工具喜歡NHibernate的,與這樣的事情對你摒棄的理由。如果是這樣,那麼我傾向於爲此使用數據讀取器。這是費力而不是複雜的恕我直言。

當您在讀取器中迭代時,跟蹤變量中的當前A.Id,並將A的「當前」實例也保存在變量中。閱讀器中的每一行(如果A.Id已更改)都將當前的A設置爲新實例,並將其添加到列表中。並且在閱讀器中的每一行創建一個B並將其添加到當前的AList<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")) 
     }; 
} 

不要忘了事後處置你的讀者......