C# 将sql联接结果映射到对象的最佳方法是什么?

C# 将sql联接结果映射到对象的最佳方法是什么?,c#,.net,sqldatareader,C#,.net,Sqldatareader,我需要将SQL连接结果映射到对象。例如,有两个具有一对多关系的表类别和产品。我需要将它们映射到类,如下所示: public class CategoryInfo { public Category Category {get;set;} public List<Product> Products {get;set} } 问题是我必须使用SqlDataReader并将其行映射到CategoryInfo对象。这是要求。我不允许在记忆中加入。 这是最简单的情况,多个连接超过两

我需要将SQL连接结果映射到对象。例如,有两个具有一对多关系的表类别和产品。我需要将它们映射到类,如下所示:

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;
    }

上述方法将DataTable列与类属性相匹配。DataTable列只需与类属性同名即可工作

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

我不允许这样做,正如我在讨论中注意到的那样。