【问题标题】:Select List of Object Which Contain Another List by LINQ通过 LINQ 选择包含另一个列表的对象列表
【发布时间】:2016-09-08 10:13:59
【问题描述】:

我有如下所示的三个数据库模型

我有两个DTO 类,如下所示

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

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

现在我想从数据库中检索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

【问题讨论】:

  • claims = r.claims.Select(x => 在此处输入更多代码)

标签: c# linq linq-to-sql


【解决方案1】:

以下更改应该有助于获得结果

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();

如果您使用 Include 方法,那么下面的查询可能会有所帮助

 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();

【讨论】:

  • 声明是对象列表。
  • 已编辑以从列表中检索
  • 这会在将 LINQ 转换为 SQL 期间返回异常
  • 意识到这一点并进行了更多编辑。如果这不起作用,请告诉我。在这种情况下,我会将整个表达式更改为 Lambda 表达式
猜你喜欢
  • 2011-04-25
  • 1970-01-01
  • 2012-05-31
  • 2014-02-17
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多