Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Datatable转换为strogly类型的模型_C#_Asp.net_Datatable - Fatal编程技术网

C# 将Datatable转换为strogly类型的模型

C# 将Datatable转换为strogly类型的模型,c#,asp.net,datatable,C#,Asp.net,Datatable,我有一个这样的模型课 public class Profile { public string FirstName { get; set; } public string LastName { get; set; } public string NickName { get; set; } public string City { get; set; } public string State { get; set; } .............

我有一个这样的模型课

public class Profile
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string NickName { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    ...................... etc

}
以及具有相同数据类型的数据表。表示数据表中的列将是
FirstName、LastName、昵称、City、State
。数据表将只有一行。 现在我想将这个数据表中的数据复制到
Profile
model。现在我就是这样做的

   var sp = new Profile();
    DataTable dt = ProfileDAL.GetProfile(profileId);
    if (profile.Rows.Count > 0)
    {
        sp.FirstName = ReferenceEquals(dt.Rows[0]["FirstName"], "")
            ? ""
            : dt.Rows[0]["FirstName"].ToString();
        sp.LastName = ReferenceEquals(dt.Rows[0]["LastName"], "")
            ? ""
            : dt.Rows[0]["LastName"].ToString();
        sp.NickName = ReferenceEquals(dt.Rows[0]["NickName"], "")
            ? ""
            : dt.Rows[0]["NickName"].ToString();
   }

有什么优雅的方法吗?就像我有一个巨大的数据表要转换,当我这样做的时候就像我现在正在做的一样。这将需要很长的时间和大量的代码行。有谁能指出更好的吗?

这是一个解决方案,我用它来处理带有实体的地图数据表

或者您可以使用自动映射器

IList<Profile> result = new List<Profile>();


result = currentDataTable.AsEnumerable().Select(row => new Profile
             {
                 FirstName = row["FirstName"].ToString(),
                 LastName = row["LastName"].ToString()
             }
             ).ToList<Profile>();
IList结果=新列表();
结果=currentDataTable.AsEnumerable()。选择(行=>新配置文件
{
FirstName=行[“FirstName”]。ToString(),
LastName=行[“LastName”]。ToString()
}
).ToList();

这是我用来节省时间的东西。我创建它作为DataTable的扩展。你所要做的就是

DataTable dt = ProfileDAL.GetProfile(profileId);
var profile = dt.Rows[0].ToEntity<Profile>();  //<-- new changes
DataTable dt=ProfileDAL.GetProfile(profileId);

var profile=dt.Rows[0].ToEntity()//
foreach
loop在哪里?@SidM这是我问题中的一个错误,现在更正了。你检查了我的答案了吗?最好的方法是自动生成,谢谢你的帮助。这正是我要找的。但是我在使用这个扩展时遇到了一些问题,可能是我对这样的案例知之甚少。我得到了一个类似这样的错误:“System.Data.DataTable”不包含“ToEntity”的定义,并且最佳扩展方法重载“BL.DataExtensions.ToEntity(System.Data.DataRow)”具有一些无效的参数,这很糟糕!我已经更新了答案。实体的代码略有不同。而不是
var profile=dt.ToEntity()应该是
var profile=dt.Rows[0].ToEntity()因为to
.ToEntity
接受
DataRow
而不是
DataTable
。是的,它现在可以工作了。我想让你们知道扩展是超冷的。不客气。在多次尝试使数据库访问更容易之后,我花了很长时间才到达那里。随着代码的开发和重构,您将不断改进。还可以检查整洁和其他迷你ORM
DataTable dt = ProfileDAL.GetProfiles();
var profiles = dt.ToList<Profile>();
DataTable dt = ProfileDAL.GetProfile(profileId);
var profile = dt.ToList<Profile>().FirstOrDefault();
public static class DataExtensions
{
    public static T ToEntity<T>(this DataRow dr) where T : new()
    {
      DataColumnCollection columns = dr.Table.Columns;
      T obj1 = new T();
      foreach (PropertyInfo propertyInfo in obj1.GetType().GetProperties())
      {
        if (columns.Contains(propertyInfo.Name) && dr[propertyInfo.Name] != DBNull.Value)
        {
          if (propertyInfo.PropertyType.IsGenericType)
          {
            object obj2 = Convert.ChangeType(dr[propertyInfo.Name], propertyInfo.PropertyType.GetGenericArguments()[0]);
            propertyInfo.SetValue((object) obj1, obj2, (object[]) null);
          }
          else
          {
            object obj2 = Convert.ChangeType(dr[propertyInfo.Name], propertyInfo.PropertyType);
            propertyInfo.SetValue((object) obj1, obj2, (object[]) null);
          }
        }
      }
      return obj1;
    }

    public static List<T> ToList<T>(this DataTable dt) where T : new()
    {
      List<T> list = new List<T>();
      foreach (DataRow dr in (InternalDataCollectionBase) dt.Rows)
        list.Add(DataExtensions.ToEntity<T>(dr));
      return list;
    }
}