将数据表转换为强类型模型

时间:2014-07-31 10:34:54

标签: 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; }
    ...................... etc

}

和一个数据类型相同的数据表。表示数据表中的列将为FirstName,LastName,NickName,City,State。数据表只有一行。 现在我想将此数据表中的数据复制到Profile模型。现在我这样做。

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

有没有优雅的方式这样做?就像我有一个巨大的数据表转换,当我这样做,就像我现在正在做的。这需要很长时间和许多代码行。任何人都可以指出更好的东西吗?

2 个答案:

答案 0 :(得分:1)

这里是解决方案我将它用于带有实体的地图数据表

或者您可以使用 AutoMapper

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


result = currentDataTable.AsEnumerable().Select(row => new Profile
             {
                 FirstName = row["FirstName"].ToString(),
                 LastName = row["LastName"].ToString()
             }
             ).ToList<Profile>();

答案 1 :(得分:1)

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

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

如果你想要一个清单

DataTable dt = ProfileDAL.GetProfiles();
var profiles = dt.ToList<Profile>();

或者使用LINQ获取您的实体

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