将 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对象。这是要求。不允许我在内存中进行联接。这是最简单的情况,还会发生多个联接(两个以上的表)和多对多关系。您有什么建议如何以正确的方式执行此操作吗?

将 sql JOIN 结果映射到对象的最佳方法是什么?

您可以使用一些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{...}))否则我会创建新类别并将其添加到类别列表中。在表格的一次迭代结束时,我有类别列表,其中包含链接到正确类别的所有产品。