从Backend中的Data填充Model类

时间:2016-06-29 18:35:22

标签: c# stored-procedures sqldatareader

我有一个数据库,它有两个表,如下所示,请忽略数据,但格式如下

enter image description here

现在我有一个构造如下的Model类

public class FamilyModel
    {

        public string Name { get; set; }
        public List<FamilyModel> FamilyList { get; set; }
        public FamilyModel()
        {
            FamilyList = new List<FamilyModel>();
        }
}

现在我想要的是从两个表中获取数据并填充列表。

所以我有一个存储过程,返回如下数据

enter image description here

所以我写了一些代码来填充上面的类。但它起作用了。我调试的时候得到5分。我希望计数为2,当扩展时,我想要像FamilyA一样的东西 - &gt; {Nick,Tom,Pam} .. FamilyB-&gt; {Harry}等等。请帮助修复此代码。

    public static FamilyModel familyData()
            {
                //FamilyModel fml = new FamilyModel();
                //fml.FamilyList = new List<FamilyModel>();
                using (SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0; AttachDbFilename=|DataDirectory|\Families.mdf; Integrated Security=True; Connect Timeout=30;"))
                {
                    con.Open();
                    SqlCommand cmd = new SqlCommand("sp_GetFamilies", con);
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlDataReader dr = cmd.ExecuteReader();
                    while (dr.Read())                                                             {                                                          
                        FamilyModel fm = new FamilyModel();                    
                        fm.Name = dr["FamilyName"].ToString();
                        foreach (var item in dr["ChildName"].ToString())
                        {
                            if (Convert.ToInt32(dr["id"]) == Convert.ToInt32(dr["FID"]))
                            {
                                fm.FamilyList.Add(new FamilyModel() { Name = dr["ChildName"].ToString() });
                            }
                        }

                    }
 return fm;
                }

    }

2 个答案:

答案 0 :(得分:0)

您需要区分数据集中的新行和新的Jenkinsfile。一种方法是声明一个模型列表,然后查找&#34;右键&#34;添加当前子行之前的一个:

FamilyModel

对于数据库查询中的每一行,您需要:

  1. 尝试在列表中查找该系列
  2. 如果您找不到,请创建一个新的。将其添加到您的顶级列表中。
  3. 将子名称添加为&#34;当前&#34;的子元素。家族。

答案 1 :(得分:0)

以下是一些应该能够正确理解的源代码。在它下面,我已经包含了对正在发生的事情的一些解释。

using Dapper;
public class FamilyModel
{
    public int Id { get; set;}
    public string FamilyName { get; set; }
    public List<Person> Members { get; set; } = new List<Person>();//Initializer for Auto-Property, C#6<= only
}
public class Person
{
    public int Id { get; set;}
    public string Name { get; set; }
}
public class DatabasePOCO
{
    public string FamilyName { get; set; }
    public string ChildName { get; set; }
    public int Fid { get; set; }
    public int Id { get; set;}
}
void Main()
{
    using (IDbConnection conn = new SqlConnection("..."))
    {
        conn.Open();
        var raw = conn.Query<DatabasePOCO>("sp_GetFamilies",
        commandType: CommandType.StoredProcedure);//Could be dynamic, not typed
        var familyList = raw
        .GroupBy(x => x.Fid)
        .Select(x =>
        {
            var rawMembers = x.ToList();
            var fId = x.First().Fid;
            var fName = x.First().FamilyName;
            var members = rawMembers.Select(y => new Person 
            {
                Id = y.Id,
                Name = y.ChildName
            });
            return new FamilyModel
            {
                Id = fId,
                FamilyName = fName,
                Members = members.ToList()
            };
        });
        //Whatever else you want to do here
    }
}
  1. 考虑使用Dappper。这是一个很棒的ORM,它使得从数据库访问数据非常容易。它的设计目的是与SQL Server一起使用,但我也成功使用了Oracle,大多数其他RMDBS系统都可能正常工作。
  2. 考虑使用Slapper。如果您可以控制存储过程,则可以减少以下样板代码的批次
  3. 如果您使用Dapper(我希望您这样做),您可以使用C#动态对象,或者您可以创建POCO以帮助您在代码上实施某些类型。
  4. 了解您是否关心参考平等。我在下面提供的代码强制引用对象的相等性。根据我的经验,参考平等并不会给你带来太大的影响,并且难以执行。
相关问题