将通过LINQ返回的列表转换为类对象列表

时间:2014-06-24 14:07:26

标签: c# linq

我使用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个对象列表?

3 个答案:

答案 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
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,以便更有意义。