1

我有一个形式的数据模型:

A类:

  • ID

  • 日期

  • List<B>

B类

  • 姓名

  • ID

我调用了返回数据集的 DB sp

A_Id, A_Date, B_Name, B_Id

将此数据集映射到类型对象的最易读的方法是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并将其添加到 currentAList<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 回答