将通过LINQ返回的列表转换为类对象列表
本文关键字:列表 转换 对象 LINQ 返回 | 更新日期: 2023-09-27 18:10:01
我使用LINQ-to-SQL得到了一个列表:
var query = studentRankTable
.AsEnumerable()
.GroupBy(r =>
new
{
Name = r.Field<string>("ID"),
Action = r.Field<string>("Name")
})
.Select(grp =>
new
{
Name = grp.Key.Name,
Action = grp.Key.Action,
Count = grp.Count()
});
query = query.ToList();
query
的终值为:
[0] { Name = "831001", Action = "Login", Count = 8 } <Anonymous Type>
[1] { Name = "810030", Action = "Game Map Visit", Count = 4 } <Anonymous Type>
现在我要把它转换成我定义的类:
[DataContract]
public class StudentRank
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Count { get; set; }
[DataMember]
public string Action { get; set; }
}
我不能使用foreach
,因为它的数据类型是匿名的
如何将此列表转换为StudentRank
对象列表?
您可以简单地在LINQ的Select
子句中使用StudentRank
类:
var query = studentRankTable
.AsEnumerable()
.GroupBy(r =>
new
{
Name = r.Field<string>("ID"),
Action = r.Field<string>("Name")
})
.Select(grp =>
new StudentRank
{
Name = grp.Key.Name,
Action = grp.Key.Action,
Count = grp.Count()
});
这样,这个查询的返回类型将是IQueryable<StudentRank>
,因此ToList()
将返回List<StudentRank>
,这可以很容易地使用。
如果您使用var
迭代器,实际上没有什么可以阻止您使用foreach
foreach(var s in result)
{
...
}
这个自动输入s
,甚至可以用于匿名类型
同样,这里也可以选择
query = query.Select(s => new Student { Name = s.Name, Action = s.Action, Count = s.Count });
最后,如果您拉入一个实际的列表,那就是list。ForEach方法
你可以在你的select
中试试这个:
Select(grp => new StudentRank
{
Name = grp.Key.Name,
Action = grp.Key.Action,
Count = grp.Count()
});
这样就不用为序列中的每个项目创建一个匿名类型的对象,而是为序列中的每个项目创建一个StudentRank
类型的对象。
此外,如果您只想遍历查询结果中的元素,则不必调用ToList()
.
你可以像下面这样简单地实现你想要的:
foreach(var item in items)
在这里我把你的查询结果称为items
,为了更有意义。