将 sql JOIN 结果映射到对象的最佳方法是什么?
本文关键字:最佳 方法 是什么 对象 sql JOIN 结果 映射 | 更新日期: 2023-09-27 18:37:16
我需要将SQL Join
结果映射到对象。例如,有两个表Categories
和具有一对多关系的Products
。我需要将它们映射到类,如下所示:
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;
}
上述方法将数据表列与类属性匹配。数据表列只需要与类属性同名即可工作。
我遇到了类似的问题。因此,在查询执行之后,数据读取器中将包含整个表。表行由类别信息和关联产品组成。一个类别还有更多行 - 它的一对多关系。所以我所做的是按类别 ID 对表进行排序。之后,我遍历表行并将实际行与上次处理的行进行比较。如果 ID 相同,我知道我仍在同一个类别中,我可以将新产品映射到它(sth like Categories.Last().Add(new Product{...}))
否则我会创建新类别并将其添加到类别列表中。在表格的一次迭代结束时,我有类别列表,其中包含链接到正确类别的所有产品。