我有一个强类型的课程PersonExport
。我最初将数据转换为DataTable
并在DataTable
上调用以下方法将其转换为List<PersonExport>
:
public static List<T> ConvertToList<T>(DataTable dt, out string message)
{
message = string.Empty;
var list = new List<T>();
try
{
var columnNames = dt.Columns.Cast<DataColumn>()
.Select(c => c.ColumnName)
.ToList();
var properties = typeof(T).GetProperties();
list = dt.AsEnumerable().Select(row =>
{
var objT = Activator.CreateInstance<T>();
foreach (var pro in properties)
{
if (columnNames.Contains(pro.Name))
{
var value = row[pro.Name];
var typeName = value.GetType().FullName;
if (typeName == "MySql.Data.Types.MySqlDateTime")
{
var mySqlDateTime = (MySqlDateTime) value;
if (mySqlDateTime.IsValidDateTime)
{
value = Convert.ToDateTime(mySqlDateTime.ToString());
pro.SetValue(objT, value, null);
}
}
else
{
pro.SetValue(objT, row.IsNull(pro.Name) ? null : value, null);
}
}
}
return objT;
}).ToList();
}
catch (Exception ex)
{
message = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message;
}
return list;
}
但是,一旦我开始从返回的DataTable
中删除列,它就不再有效,因为DataTable
中的列与PersonExport
列表中的属性不匹配。
我最终在这里使用导出的列表导出到excel,但由于我已经DataTable
修改了它并且无法反序列化为List<PersonExport>
:
//Trying to get data into List<object>
List<object> persons = GetPersonExport(query, out message);
var exportData = new Dictionary<string, List<object>> { { "xldata", persons} };
//Deserialize to List<object> to export
var persons = JsonConvert.DeserializeObject<List<object>>(args["xldata"]);
上面的行只返回一个空对象列表。
有些事让我思考,但我想知道什么是最好的方法。我使用EPPLUS库将数据导出到excel,它可以选择隐藏列,所以最好只导出整个对象并隐藏你不想要的列,这样你就可以避免匿名类型或者我可以做的仍然是获取整个对象,但然后将其转换为DataTable然后删除列?想法?
答案 0 :(得分:2)
你想要的只是:
public IEnumerable<object> GetListOfObject()
{
foreach (var prod in TenMostExpensiveProducts().Tables[0].AsEnumerable())
{
yield return prod;
}
}
或者:
TenMostExpensiveProducts().Tables[0].AsEnumerable().Select (x => x).ToList<object>()
但你可以通过这样的linq让它变得更优雅:
from prod in TenMostExpensiveProducts().Tables[0].AsEnumerable()
where prod.Field<decimal>("UnitPrice") > 62.500M
select prod
或者像这样(直接在DataSet上调用AsDynamic):
TenMostExpensiveProducts().AsDynamic().Where (x => x.UnitPrice > 62.500M)
我更喜欢最后一种方法,而且最灵活。
P.S。:不要忘记连接System.Data.DataSetExtensions.dll
参考
答案 1 :(得分:0)
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
StringBuilder sbRes = new StringBuilder();
jSon.Serialize(rows, sbRes);
ret = sbRes.ToString();