我有一个以下LINQ
查询,我想从Master
数据中选择填充child
数据,而且我也想计算大小。
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
s列表,每个列表包含2个项目:
- 清单1:
- 消息:名称:名称1,大小16
- 消息:名称:名称1,大小16
- 清单2:
- 消息:名称:名称11,大小17
- 消息:名称:名称11,大小17
您错过了对FirstOrDefault
的呼叫,该电话将通过T.Select
返回的IEnumerable<Child>
返回到Message
构造函数。
您的ToList
调用也位于错误的位置 - 当您真正想要List<Message>
时,您只是将IEnumerable<Child>
转换为List<Child>
,在创建每个Message
之后。
更改为:
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();
edit :我认为您担心FirstOrDefault
仅返回1个值 - 但是,请记住,这是1 Child
per name ,因为您只是分组他们用名字 - 正是您想要的。最终List<Message>
包含带有大小的唯一名称。
编辑2.0 :好的,基于您自己的答案,这阐明了您的问题,我认为此查询将更好地满足您的需求:
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>>
,按名称分组(但保留原始消息数),并且每条消息都将计算Size
属性。