【发布时间】:2015-02-06 21:20:20
【问题描述】:
我有一个来自存储过程的一对多关系。我在查询中有几个一对多的关系,我正在尝试将这些字段映射到 C# 对象。我遇到的问题是由于一对多的关系,我得到了重复的数据。这是我的代码的简化版本:
这是对象类:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public List<Color> FavoriteColors { get; set; }
public List<Hobby> Hobbies { get; set; }
public Person()
{
FavoriteColors = new List<Color>();
Hobbies = new List<Hobby>();
}
}
public class Color
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Hobby
{
public int Id { get; set; }
public string Name { get; set; }
}
这是我检索数据的方式:
using (SqlConnection conn = new SqlConnection("connstring.."))
{
string sql = @"
SELECT
Person.Id AS PersonId,
Person.Name AS PersonName,
Hobby.Id AS HobbyId,
Hobby.Name AS HobbyName,
Color.Id AS ColorId,
Color.Name AS ColorName
FROM Person
INNER JOIN Color on Person.Id = Color.PersonId
INNER JOIN Hobby on Person.Id = Hobby.PersonId";
using (SqlCommand comm = new SqlCommand(sql, conn))
{
using (SqlDataReader reader = comm.ExecuteReader(CommandBehavior.CloseConnection))
{
List<Person> persons = new List<Person>();
while (reader.Read())
{
Person person = new Person();
//What to do
}
}
}
}
如您所见,给定的 Person 可以有多种颜色和爱好。通常,我会使用实体框架来解决这个映射,但我们不允许使用任何形式。有没有一种技术可以正确地展开这些数据?
【问题讨论】:
-
或许你可以使用reflect构建sql并得到结果
-
@JeffreyZhang 你好,我不知道你的意思。什么是反射?以及如何在映射中构建 sql me?对不起,只是想理解的问题。
-
您将需要 3 个“选择”语句。
-
在对阅读器进行迭代时,检查人员列表中是否存在现有行人员 ID。如果不创建一个新的人对象并声明两个单独的列表来保存爱好和颜色信息。对于后续的迭代,继续填充这两个列表,因为它们将始终是相同的人员数据。一个你得到一个新人的新记录,将这些列表添加到人员对象并从一个新的人员对象开始
标签: c# ado.net sqldatareader