我有一个下面的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个项目:
答案 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>>
属性。