将通过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返回的列表转换为类对象列表

您可以简单地在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,为了更有意义。