2013-05-29 37 views
1

以下是迄今为止的方法。从数据库填充类

public static void FillUserListClass() 
{  
    List<User> UserList = new List<User>(); 
    OleDbConnection conn = new OleDbConnection(strAccessConn); 
    string query = "SELECT ControlNumber, UserName FROM Log WHERE Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered');"; 

    OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn); 
    DataTable dt = new DataTable(); 

    try 
    { 
     adapter.Fill(dt); 

     for (int ctr = 1; ctr <= dt.Rows.Count; ctr++) 
     { 
      UserList.UserName.Add(dt.Columns["UserName"].ToString()); 
      UserList.ControlNumber.Add(Convert.ToInt32(dt.Columns["ControlNumber"])); 
     } 
    } 
    catch (OleDbException ex) 
    {} 
    finally 
    { 
     conn.Close(); 
    }    
} 

我想要做的就是用我的查询抢控制编号&用户名,并进行了独特的类为每个用户名。每个用户类别

class User 
{ 
    public string UserName { get; set; } 
    public List<Int32> ControlNumber { get; set; } 
} 

将包含用户的名称(用户名)和我使用我的查询拉出的控制号码列表(controlNumbers)。

+0

你想在运行时创建类吗?不是吗? – Sachin

+0

这是什么问题? – MethodMan

+0

我想我没有问一个问题。但是,我只是想看看我是否在正确的道路上做我想做的事情。我是C#的新手,看起来像我..但是,然后再次,我可以投向错误的团队 – MaylorTaylor

回答

3

你也可以做到这一点很容易与LINQ和更容易阅读,更简洁:

var users = from c in dt.AsEnumerable() 
      group c by c.Field<string>("UserName") into gr 
      select new User { Username= gr.Key , 
           ControlNumbers = (from x in dt.AsEnumerable() 
                where x.Field<string>("UserName") == gr.Key 
                select x.Field<int>("ControlNumber")).ToList() }; 

更新:

List<User> userList = (from c in dt.AsEnumerable() 
       group c by c.Field<string>("UserName") into gr 
       select 
       new User { 
          Username= gr.Key , 
          ControlNumbers = 
          (from x in dt.AsEnumerable() 
          where x.Field<string>("UserName") == gr.Key 
          select x.Field<int>("ControlNumber")).ToList() 
          } 
         ).ToList(); 

所以基本上,你正在把你的数据表,按UserName分组,并使用这个独特的列表用户名再次查询数据表,读取与当前用户名有关的所有控制号。

+0

我收到“不能隐式转换类型'System.Collections.Generic.List '到'系统。 Collections.Generic.List '“在.ToList()部分....不应该这样.ToList MaylorTaylor

+0

@MaylorTaylor我编辑了答案。你得到了这个异常,因为你的用户类定义有Control List的'List ',但我的例子是建立一个'List ',因此是'ClassCastException'。我将代码更改为'select x.Field (“ControlNumber”)',并且应该修复它。 – Icarus

+0

好吧,这个LINQ的东西现在变得更有意义了......但是如何用这些信息填充我的User类(它包含'string UserName'和'列表 ControlNumber')? – MaylorTaylor

1

你可以使用一个Dictionary这样的:

public static void FillUserListClass() 
{ 
    Dictionary<string, User> UserList = new Dictionary<string, User>(); 
    OleDbConnection conn = new OleDbConnection(strAccessConn); 
    string query = "SELECT ControlNumber, UserName FROM Log WHERE Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered');"; 

    OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn); 
    DataTable dt = new DataTable(); 

    try 
    { 
     adapter.Fill(dt); 

     for (int ctr = 1; ctr <= dt.Rows.Count; ctr++) 
     { 
      var row = dt.Rows[ctr]; 
      var userName = row["UserName"].ToString(); 
      if (!UserList.ContainsKey(userName)) 
      { 
       UserList.Add(userName, new User() 
       { 
        UserName = userName, 
        ControlNumber = new List<int>() 
       }); 
      } 
      UserList[userName].ControlNumber.Add((int)row["ControlNumber"]); 
     } 
    } 
    catch (OleDbException ex) 
    { 

    } 
    finally 
    { 
     conn.Close(); 
    } 
}