如何以优雅的方式改变List<>结构体

时间:2015-10-08 15:31:14

标签: c# .net linq

我在项目中使用LINQ授权。

我有这个LINQ:

    var result = (from inspArch in inspectionArchives
             from inspAuth in inspArch.InspectionAuthority               
             select new 
             {
                Id = inspArch.Id,
                clientId = inspArch.CustomerId,
                authId = inspAuth.Id
             }).ToList();

执行LINQ后结果具有此值:

enter image description here

是否有任何优雅的方式(例如使用LINQ或更改现有的LINQ)从上面的列表创建,像这样的新列表:

enter image description here

提前谢谢。

2 个答案:

答案 0 :(得分:2)

我还没有构建它以查看它是否编译,但这应该有效。您需要聚合Id和AuthId字段。

var result = (from inspArch in inspectionArchives
         from inspAuth in inspArch.InspectionAuthority               
         select new 
         {
            Id = inspArch.Id,
            clientId = inspArch.CustomerId,
            authId = inspAuth.Id
         })
.GroupBy(g => g.clientId)
.select(s => new {
    Id = string.Join(",", s.Select(ss => ss.Id.ToString())),
    ClientId = s.Key,
    AuthId = string.Join(",", s.Select(ss => ss.authId.ToString()).Distinct()),
}).ToList();

答案 1 :(得分:1)

您需要date_format($date, 'Y-m-d H:i:s'); ,并且可以对结果group by应用String.Join: -

IGrouping

这里棘手的部分是对两个对象进行分组,即 var result = (from inspArch in inspectionArchives from inspAuth in inspArch.InspectionAuthority group new { inspArch, inspAuth } by inspArch.CustomerId into g select new { Id = String.Join(",",g.Select(x => x.inspArch.Id), clientId = x.Key, authId = String.Join(",",g.Select(x => x.inspAuth.Id) }).ToList(); ,因为我们需要从两者中访问属性。

<强>更新

由于这是实体框架,因此无法将方法new { inspArch, inspAuth }转换为SQL,因此我们可以使用String.Join将分组对象恢复到内存中,然后将其投影为: -

AsEnumerable