2015-10-08 48 views
-1

我正在使用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

谢谢您提前。

+3

使用的客户端ID –

+0

组@ M.kazemAkhgary我tryed,但我需要创建leftand右侧 – Michael

+0

@迈克尔阵列 - 检查我的更新您的错误。 –

回答

1

你需要group by,你可以得到的IGrouping适用String.Join: -

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 }因为我们需要从两个访问性能。

更新:

由于这是实体框架,它将不能够在方法String.Join转换为SQL,所以我们可以使用AsEnumerable带回分组的对象到内存中,然后投射像这样: -

var result = (from inspArch in inspectionArchives 
       from inspAuth in inspArch.InspectionAuthority 
       group new { inspArch, inspAuth } by inspArch.CustomerId into g 
       select g).AsEnumerable() 
         .Select(g => new 
         { 
          Id = String.Join(",",g.Select(x => x.inspArch.Id), 
          clientId = x.Key, 
          authId = String.Join(",",g.Select(x => x.inspAuth.Id) 
         }).ToList(); 
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(); 
+0

感谢发布。我得到这个异常: LINQ to Entities不能识别方法'System.String加入(System.String,商店表达。 任何想法如何解决它? – Michael

+0

LINQ to Entities无法将.ToString()转换为SQL,因此在使用select语句或删除ToString之前,需要找到一种方法将Id转换为字符串(如果它尚未)相信string.Join会将它转换为你 – JB06

+0

@Michael,我不确定是否需要.ToString()。你可能可以删除它。我认为另一种可能性是强制查询运行,然后处理结果。我想你可以通过在.GroupBy(...)之前放置一个.ToList()来实现。 – user2023861

相关问题