我有以下形式的的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如何相关。 –
已修复。形式已经过时了 –