我使用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
个对象列表?
答案 0 :(得分:7)
您可以简单地使用LINQ的StudentRank
子句中的Select
类:
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>
,可以轻松使用。
答案 1 :(得分:2)
如果您使用var
迭代器
foreach(var s in result)
{
...
}
这会自动输入s
,甚至适用于匿名类型
此外,Select会在这里工作
query = query.Select(s => new Student { Name = s.Name, Action = s.Action, Count = s.Count });
最后,如果您进入实际列表,则会有List.ForEach方法
答案 2 :(得分:1)
您可以在select
中尝试这个:
Select(grp => new StudentRank
{
Name = grp.Key.Name,
Action = grp.Key.Action,
Count = grp.Count()
});
这样,您可以在序列中创建类型为StudentRank
foreach项的对象,而不是在序列中创建匿名类型foreach项的对象。
此外,如果您只想迭代查询结果中的元素,则不必调用ToList()
。
您可以轻松实现以下目标:
foreach(var item in items)
我将您的查询结果称为items
,以便更有意义。