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