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

时间:2013-10-28 08:12:09

标签: c# .net sqldatareader

我需要将SQL Join结果映射到对象。例如,有两个表CategoriesProducts具有一对多关系。我需要将它们映射到类似于:

的类
public class CategoryInfo
{
   public Category Category {get;set;}
   public List<Product> Products {get;set}
}

问题是我必须使用SqlDataReader并将其行映射到CategoryInfo个对象。这是要求。我不被允许在内存中进行连接。 这是最简单的情况,多个连接(超过两个表)和多对多关系也会发生。您有什么建议以正确的方式做到这一点吗?

4 个答案:

答案 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{...}))否则我创建新的类别并将其添加到类别列表。在通过表格的一次迭代结束时,我有一个类别列表,其中所有产品都链接到正确的类别。