C# 将sql联接结果映射到对象的最佳方法是什么?
我需要将SQL连接结果映射到对象。例如,有两个具有一对多关系的表类别和产品。我需要将它们映射到类,如下所示:C# 将sql联接结果映射到对象的最佳方法是什么?,c#,.net,sqldatareader,C#,.net,Sqldatareader,我需要将SQL连接结果映射到对象。例如,有两个具有一对多关系的表类别和产品。我需要将它们映射到类,如下所示: public class CategoryInfo { public Category Category {get;set;} public List<Product> Products {get;set} } 问题是我必须使用SqlDataReader并将其行映射到CategoryInfo对象。这是要求。我不允许在记忆中加入。 这是最简单的情况,多个连接超过两
public class CategoryInfo
{
public Category Category {get;set;}
public List<Product> Products {get;set}
}
问题是我必须使用SqlDataReader并将其行映射到CategoryInfo对象。这是要求。我不允许在记忆中加入。
这是最简单的情况,多个连接超过两个表和多对多关系也会发生。您对如何正确执行此操作有何建议?您可以使用一些ORM库,如Entity Framework或NHibernate您的VO类也应该是这样的:
public class Category
{
public int ID {get;set;}
public string Name {get;set;}
.....
public List<Product> Products {get;set}
}
因此,您可以使用其产品填充每个类别,一旦您将所有类别拉入每个类别,您将产品拉入每个类别,因为似乎不允许使用ORM,您可以使用通用方法将数据从DataTable拉入对象,如下所示:
public static List<T> DataTableToEntities<T>(DataTable dt)
{
string propName = string.Empty;
List<T> entityList = new List<T>();
foreach (DataRow dr in dt.Rows)
{
T entity = System.Activator.CreateInstance<T>();
System.Reflection.PropertyInfo[] entityProperties = typeof(T).GetProperties();
foreach (System.Reflection.PropertyInfo item in entityProperties)
{
propName = item.Name;
if (dt.Columns.Contains(propName))
{
item.SetValue
(
entity,
dr[propName].GetType().Name.Equals(typeof(DBNull).Name)? null : dr[propName],
null
);
}
}
entityList.Add(entity);
}
return entityList;
}
上述方法将DataTable列与类属性相匹配。DataTable列只需与类属性同名即可工作 我遇到了类似的问题。因此,在执行查询之后,您的数据读取器中就有了整个表。表行由类别信息和关联产品组成。一个类别(其一对多关系)也有更多行。因此,我所做的事情是按类别id对表进行排序。之后,我遍历表中的行,并将实际行与上次处理的行进行比较。如果ID相同,我知道我仍然在同一个类别上,我可以将新产品映射到它,例如Categories.Last.Addnew product{…}否则我将创建新类别并将其添加到类别列表中。在表格的一次迭代结束时,我有一个类别列表,其中所有产品都链接到了正确的类别。我不允许这样做,正如我在讨论中注意到的那样。