我有以下形式的的DataModel:映射DB數據列表的列表
A類:
標識
日期
List<B>
B類
名稱
標識
我invole DB SP返回的
A_Id, A_Date, B_Name, B_Id
數據集什麼是映射的最易讀的方式將此數據集設置爲類型爲的對象?
我試過的數據集和DataReader - 似乎都複雜
我有以下形式的的DataModel:映射DB數據列表的列表
A類:
標識
日期
List<B>
B類
名稱
標識
我invole DB SP返回的
A_Id, A_Date, B_Name, B_Id
數據集什麼是映射的最易讀的方式將此數據集設置爲類型爲的對象?
我試過的數據集和DataReader - 似乎都複雜
假設你有一個表,你可以使用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()
我假設你有沒有使用ORM工具喜歡NHibernate的,與這樣的事情對你摒棄的理由。如果是這樣,那麼我傾向於爲此使用數據讀取器。這是費力而不是複雜的恕我直言。
當您在讀取器中迭代時,跟蹤變量中的當前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"))
};
}
不要忘了事後處置你的讀者......
目前尚不清楚,從你的質疑A和B如何相關。 –
已修復。形式已經過時了 –