每个子记录都需要消息大小

时间:2019-02-22 05:42:24

标签: c# linq

我有一个下面的LINQ查询,我想从child数据中选择填充Master数据,此外我还想计算大小。

this.Size = JsonConvert.SerializeObject(Child).Length;

这是查询和主数据,

var mast = new List<Master>
{
    new Master{Id=1, Name="Name1"},
    new Master{Id=2, Name="Name1"},
    new Master{Id=3, Name="Name11"},
    new Master{Id=4, Name="Name11"},
};

var g = from data in mast
        group data by new { data.Name } into T
        select new Message(T.Select(t => new Child
        {
            Name = t.Name
        }).ToList());

和支持类,

public class Master
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Child
{
    public string Name { get; set; }
}

public class Message
{
    public Child Child { get; set; }
    public int Size { get; set; }
    public Message(Child Child)
    {
        this.Child = Child;
        this.Size = JsonConvert.SerializeObject(Child).Length;
    }
}

当前由于列表和单个项目之间的转换问题而出现以下错误

select new Message(T.Select(t => new Child
                    {
                        Name = t.Name
                    }).ToList());
  

无法从“ System.Collections.Generic.List”转换为“ TestApp.Child” TestApp

在这里需要做什么?谢谢!

编辑:我试图获得的最终结果是一个List<List<Message>>,其中内部List<Message>按名称分组;因此,根据我的示例数据,将有2个Message列表,每个列表包含2个项目:

  • 清单1:
    • 消息:名称:Name1,大小16
    • 消息:名称:Name1,大小16
  • 清单2:
    • 消息:名称:Name11,大小17
    • 消息:名称:Name11,大小17

1 个答案:

答案 0 :(得分:2)

您缺少对FirstOrDefault的调用,该调用将IEnumerable<Child>调用返回的T.Select传递给Message构造函数。

您的ToList呼叫也位于错误的位置-您实际上是在每个{{之后,实际上想要一个IEnumerable<Child>时将List<Child>转换为List<Message> 1}}已创建。

更改为:

Message

EDIT :我认为您担心var g = (from data in mast group data by new { data.Name } into T select new Message(T.Select(t => new Child { Name = t.Name }).FirstOrDefault())).ToList(); 调用仅返回1个值-但是,请记住,每个名称为1个FirstOrDefault < / em>,因为您只是按名称将它们分组-正是您想要的。最后的Child包含唯一的名称,并具有所需的大小。

EDIT 2.0 :好吧,根据您自己的答案(该问题已澄清您的问题),我认为此查询将更好地满足您的需求:

List<Message>

上面的代码将产生一个var messages = mast.GroupBy(m => m.Name) .Select(nameGroup => Enumerable.Repeat( new Message(new Child() { Name = nameGroup.Key }), nameGroup.Count()).ToList() ).ToList(); ,按名称分组(但保留原始消息计数),并且每条消息都将计算出List<List<Message>>属性。