我需要将SQL Join
结果映射到对象。例如,有两个表Categories
和Products
具有一对多关系。我需要将它们映射到类似于:
public class CategoryInfo
{
public Category Category {get;set;}
public List<Product> Products {get;set}
}
问题是我必须使用SqlDataReader
并将其行映射到CategoryInfo
个对象。这是要求。我不被允许在内存中进行连接。
这是最简单的情况,多个连接(超过两个表)和多对多关系也会发生。您有什么建议以正确的方式做到这一点吗?
答案 0 :(得分:0)
您可以使用一些ORM库,如Entity Framework或NHibernate
答案 1 :(得分:0)
您的VO课程也应如此:
public class Category
{
public int ID {get;set;}
public string Name {get;set;}
.....
public List<Product> Products {get;set}
}
因此,您可以使用其产品填写每个类别,一旦拉出所有类别,您就可以将产品拉到每个类别
答案 2 :(得分:0)
由于您似乎不允许使用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列只需要与您的类属性具有相同的名称即可。
答案 3 :(得分:0)
我遇到过simillar问题。因此,在查询执行后,您将在数据读取器中拥有整个表。表格行包含类别信息和相关产品。一个类别还有更多行 - 它的一对多关系。所以我所做的就是按类别ID对表进行排序。之后,我遍历表行并将实际行与最后处理的行进行比较。如果ID是相同的,我知道我仍然在同一类别,我可以将新产品映射到它(sth like Categories.Last().Add(new Product{...}))
否则我创建新的类别并将其添加到类别列表。在通过表格的一次迭代结束时,我有一个类别列表,其中所有产品都链接到正确的类别。