【问题标题】:List<DataRow> to custom List<Model>List<DataRow> 到自定义 List<Model>
【发布时间】:2018-10-26 16:46:56
【问题描述】:

我使用了以下代码:

ManageUser userObj = new ManageUser();
List<StoreUserList> storeList = new List<StoreUserList>();
StoreUserList sl = new StoreUserList();
foreach (var items in userObj.GetStoreUserList(Username, Password))
{
    sl.UserName = items[0].ToString();
    sl.EmailId = items[1].ToString();
    sl.FirstName = items[2].ToString();
    sl.LastName = items[3].ToString();
    sl.BadLoginCount = Convert.ToInt32(items[4]);
    sl.ManagerName = items[5].ToString();
    storeList.Add(sl);
}

StoreUserList 是我的模型,我在其中定义了所有属性。
ManagerUser 是以列表形式返回数据的类数据行>。

所以,我为了填充我使用上述代码的模型类型的通用列表来完成它。
但是,正如您所看到的,我已经硬编码了所有值来绑定模型,然后将该模型添加到列表中。我只是想知道有没有其他方法可以做到这一点,或者有什么神奇的方法可以轻松做到这一点?

【问题讨论】:

  • 我们可以使用给定的反射和 LINQ [这里][1] [1]:stackoverflow.com/questions/12662318/…
  • @Harsh:我认为你的代码行不通。会吗?您的 storeList 可能只包含同一行,除非您将定义“sl”的行移到循环中。
  • 您的问题将是 Convert.ToInt32。创建将 DataRow 转换为自定义类型的通用方法通常依赖于 DataRow 中的字段值是对象属性的正确类型。您可能可以使用 Convert.ChangeType 以更通用的方式执行该转换。

标签: c#


【解决方案1】:

如果您可以稍微修改ManageUser.GetStoreUserList 以返回DataTable 而不是List&lt;DataRow&gt;,那么您可以使用Automapper,它可以将IDataReader 实现映射到对象集合。

假设你有这个实体类型:

class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

然后您可以通过这种方式将DataTable 转换为List&lt;User&gt;

        // sample data table
        var dataTable = new DataTable();

        dataTable.Columns.Add("Id", typeof(int));
        dataTable.Columns.Add("Name", typeof(string));

        dataTable.Rows.Add(1, "John");
        dataTable.Rows.Add(2, "Mary");
        dataTable.Rows.Add(3, "Peter");
        dataTable.Rows.Add(4, "Sarah");

        // fill users list
        using (var reader = dataTable.CreateDataReader())
        {
            var users = Mapper.Map<IDataReader, List<User>>(reader);
        }

【讨论】:

  • 我在这里找不到Mapper 是什么,因为当我键入它时它不会出现在我的 VS 中
  • Automaper 是一个库,可以作为 NuGet 包安装。在解决方案资源管理器窗口中右键单击项目,选择“管理 NuGet 包”,找到 Automapper 并将其添加到项目中。
  • Mapper.DynamicMap 已过时。 Use the code of this answer instead
【解决方案2】:

【讨论】:

    【解决方案3】:

    我认为您的代码不会在列表中添加多个 StoreUserList 对象,但只会添加 1 个对象,其值为最后一个数据行。你需要做的是

            ManageUser userObj = new ManageUser();
            List<StoreUserList> storeList = new List<StoreUserList>();
            StoreUserList sl = null;
            foreach (var items in userObj.GetStoreUserList(Username, Password))
            {
                sl = new StoreUserList();
    
                sl.UserName = items[0].ToString();
                sl.EmailId = items[1].ToString();
                sl.FirstName = items[2].ToString();
                sl.LastName = items[3].ToString();
                sl.BadLoginCount = Convert.ToInt32(items[4]);
                sl.ManagerName = items[5].ToString();
                storeList.Add(sl);
            }
    

    否则我在您的代码中看不到任何问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      相关资源
      最近更新 更多