1

我需要将 SQLJoin结果映射到对象。例如,有两个表Categories并且Products具有一对多的关系。我需要将它们映射到如下所示的类:

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

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

4

4 回答 4

0

您的 VO 课程也应该如下所示:

 public class Category
 {
    public int ID {get;set;}
    public string Name {get;set;}
    .....
    public List<Product> Products {get;set}
 }

所以你可以用它的产品填充每个类别,一旦你拉出所有类别,你就可以将产品拉到每个类别

于 2013-10-28T08:17:16.203 回答
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 列只需要与您的类属性具有相同的名称即可。

于 2013-10-28T09:12:53.553 回答
0

您可以使用一些 ORM 库,例如 Entity Framework 或 NHibernate

于 2013-10-28T08:14:05.717 回答
0

我遇到了类似的问题。因此,在查询执行之后,您的数据阅读器中就有了整个表。表格行由类别信息和相关产品组成。一个类别也有更多行 - 它的一对多关系。所以我所做的就是按类别 id 对表格进行排序。之后,我遍历表行并将实际行与最后处理的行进行比较。如果 ID 相同,我知道我仍在同一个类别中,我可以将新产品映射到它,(sth like Categories.Last().Add(new Product{...}))否则我创建新类别并将其添加到类别列表中。在表中仅一次迭代结束时,我有一个类别列表,其中所有产品都链接到正确的类别。

于 2016-07-22T20:48:49.580 回答