我有一个像这样的模型类
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();
}
有没有优雅的方式这样做?就像我有一个巨大的数据表转换,当我这样做,就像我现在正在做的。这需要很长时间和许多代码行。任何人都可以指出更好的东西吗?
答案 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;
}
}