2016-09-08 30 views
1

另一个名单上有以下是他们的对象的选择列表包含通过LINQ

enter image description here

我已经以下是他们的

class RoleDTO 
{ 
    string RoleId; 
    string EnglishName; 
    Guid TypeId; 
    List<ClaimDTO> claims; 
} 

class ClaimDTO 
{ 
    string ActionID; 
    string ActionCode; 
    string ActionLevel; 
    string GrantDate; 
} 

现在我想要两个DTO类三个数据库模型从数据库中检索对象列表RoleDTO。到目前为止,我试过

public List<RoleDTO> GetRoleByType(Guid roleTypeId) 
{ 
    var roleDTOs = (from r in ctx.Roles 
      join rc in ctx.RoleClaims on r.RoleID equals rc.RoleID 
      join a in ctx.Actions on rc.ActionID equals a.ActionID 
      where r.RoleTypeID == roleTypeId 
      select new RoleDTO 
      { 
       RoleId = r.RoleID, 
       EnglishName = r.EnglishName, 
       TypeId = r.TypeID, 
       claims = List of ClaimDTO objects related to this role 
      }).ToList(); 

    return roleDTOs; 
} 

我的问题是我怎么能检索SELECT语句中ClaimDTO对象列表。我的linq是否正确? 我使用Telerik OpenAccess作为ORM

+0

索赔= r.claims。选择(x =>在此输入更多代码) – jdweng

回答

0

下面的变化应该有助于得到的结果

public List<RoleDTO> GetRoleByType(Guid roleTypeId) 
{ 
    var roleDTOs = (from r in ctx.Roles 
    join rc in ctx.RoleClaims on r.RoleID equals rc.RoleID 
    where r.RoleTypeID == roleTypeId 
    select new RoleDTO 
    { 
     RoleId = r.RoleID, 
     EnglishName = r.EnglishName, 
     TypeId = r.TypeID, 
     claims = ctx.Actions.Where(c => c.ActionId == rc.ActionId).Select(s => new ClaimDTO 
     { 
     ActionID = s.ActionID, 
     ActionCode = s.ActionCode, 
     ActionLevel = s.ActionLevel, 
     GrantDate = s.GrantDate 

     })ToList() 


    }).ToList(); 

return roleDTOs; 
} 

另一种选择

List<ClaimDTO> claimsList = ctx.Actions.Select(s => new ClaimDTO 
     { 
     ActionID = s.ActionID, 
     ActionCode = s.ActionCode, 
     ActionLevel = s.ActionLevel, 
     GrantDate = s.GrantDate 

     })ToList(); 

var roleDTOs = ctx.Roles.Join(ctx.RoleClaims, r => r.RoleID, rc => rc.RoleID, (r,rc) => new 
      { 
      r,rc 
      }).Where(r => r.RoleTypeID == roleTypeId) 
      .Select(row => new RoleDTO 
      { 
       RoleID = row.r.RoleID, 
       EnglishName = row.r.EnglishName, 
       TypeID = row.r.TypeID, 
       claims = claimsList.Where(c => c.ActionId == rc.ActionId) 
      }).ToList(); 

如果你使用的方法包括以下然后查询可以帮助

var roleDTOs = ctx.Roles.Include("RoleClaims").Join(ctx.Actions, r => r.RoleClaims.Select(rc => rc.ActionID).FirstOrDefault() , a => a.actionid , (r,a) => new 
      { 
       r,a 
      }.Where(r => r.RoleTypeID == roleTypeId) 
      .Select(row => new RoleDTO 
      { 
       RoleID = row.r.RoleID, 
       EnglishName = row.r.EnglishName, 
       TypeId = row.r.RoleTypeID, 
       Claims = row.a.Select(c => new ClaimDTO 
       { 
        ActionID = c.ActionID, 
        ActionCode = c.ActionCode, 
        ActionLevel = c.ActionLabel, 
        GrantDate = row.r.RoleClaims.Select(g => g.grantDate) 

       }) 

      }).ToList(); 
+0

索赔是对象清单。 –

+0

现在编辑从列表中检索 –

+0

这将在转换LINQ到SQL期间返回exeption –

相关问题