Rod*_*kan 13 c# linq asp.net asp.net-core
我需要从另一个系统的输入中生成一个来自DataTable的IEnumerable.以下代码适用于ASP.NET 4.6.1.
public static IEnumerable<UserAssignmentDto> StaffAssignmentsUsingStoredProcedure(System.Data.DataTable dataTable)
{
var data = dataTable.AsEnumerable().Select(row =>
new UserAssignmentDto
{
Id = ((string)row["AssignmentNumber"]),
Position = (string) row["EsrPositionTitle"],
});
return data;
}
Run Code Online (Sandbox Code Playgroud)
但是,'DataTable'不再包含ASP.NET Core 2.0中'AsEnumerable'的定义.
什么是最有效的方法来生成我需要的'IEnumerable'?
Ste*_*veD 10
这是一个通用的AsEnumerable扩展函数,用于模仿经典AsEnumerable()所做的事情,从DataTable返回一个DataRows的Enumerable集合。对于希望在将代码移植到.net核心时尽量减少重构量的人很有用。
public static IEnumerable<DataRow> AsEnumerable(this DataTable table)
{
for (int i = 0; i < table.Rows.Count; i++)
{
yield return table.Rows[i];
}
}
Run Code Online (Sandbox Code Playgroud)
不是最有效的方法,而是一种替代方法,可以使用以下Select
方法:
DataRow[] rows= dataTable.Select();
Run Code Online (Sandbox Code Playgroud)
现在您有了一个IEnumerable行。此方法可以帮助某人:
public static List<T> ConvertDataTableToGenericList<T>(DataTable dt)
{
var columnNames = dt.Columns.Cast<DataColumn>()
.Select(c => c.ColumnName)
.ToList();
var properties = typeof(T).GetProperties();
DataRow[] rows= dt.Select();
return rows.Select(row =>
{
var objT = Activator.CreateInstance<T>();
foreach (var pro in properties)
{
if (columnNames.Contains(pro.Name))
pro.SetValue(objT, row[pro.Name]);
}
return objT;
}).ToList();
}
Run Code Online (Sandbox Code Playgroud)
您可以做的最有效的事情之一就是自己编写迭代代码,使用 for 循环而不是 LINQ,只需迭代 DataTable 行并IEnumerable<UserAssignmentDto>
“手动”构建/水合方法返回值。
由于 DataTable 没有在 .NET Core 2.0 中实现枚举器,因此您将需要使用“常规”for
循环来迭代行。您无法使用foreach
,因为 DataTable 在 .NET Core 2.0 中尚未实现 IEnumerable。
public static IEnumerable<UserAssignmentDto> StaffAssignmentsUsingStoredProcedure(System.Data.DataTable dataTable)
{
var retList = new List<UserAssignmentDto>();
for(int i = 0; i < dataTable.Rows.Count; i++)
{
var row = dataTable.Rows[i];
var temp = new UserAssignmentDto(){
Id = row["AssignmentNumber"],
Position = row["EsrPositionTitle"]
};
retList.Add(temp);
}
return retList;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14588 次 |
最近记录: |