LINQ查询Singe Out Put中的多列表



我的表格如下

ID | Reason | PrID
----------------- 
1   abc      null
2   dhe      null
3   aerc      1
4   dwes      2
5   adfje     1

我有班级

 public class Reason
{
    public int Id { get; set; }
    public string Reson{ get; set; }
    public List<SecondryReason> SecReason{ get; set; }
    public int? PrimaryId { get; set; }
}
public class SecondryReason
{
    public int Id { get; set; }
    public string Reason { get; set; }
    public int PrimaryReasonId { get; set; }
}

我希望以层次结构级别显示如果Prid为null需要将其视为父母留下所有孩子

我正在尝试linq,无法实现这一目标

建议我在Linq

中以一种简单的方式做到这一点

so:您有一个列表/列举的类型,其中秘密列表属性为null。然后,使用LINQ您想要一个列表,这是唯一的"根"原因,但是子季节被放在列表中,但是作为类型的SensicReason?如果是这样,我找到了这样做的方法(linq和foreach):

    static IEnumerable<Reason> GetReasonsGrouped(List<Reason> reasons)
    {
        var result = reasons.Where(x => x.PrimaryId == null);
        foreach (var item in result)
        {
            item.SecReason = reasons.Where(x => x.PrimaryId == item.Id)
                                    .Select(x => new SecondryReason()
                                                      { Id = x.Id,
                                                        ReasonName = x.ReasonName,
                                                        PrimaryReasonId = item.Id
                                                       })
                                    .ToList();
        }
        return result;
    }

或只是linq,但很难阅读:

  var result = reasons.Where(x => x.PrimaryId == null)
            .Select(x =>
            {
                x.SecReason = reasons.Where(r => x.PrimaryId == x.Id)
                                     .Select(r => new SecondryReason()
                                     {
                                         Id = r.Id,
                                         ReasonName = x.ReasonName,
                                         PrimaryReasonId = x.Id
                                     })
                                     .ToList();
                return x;
            });
public class Reason
{
  public int Id { get; set; }
  public string Reson { get; set; }
  public List<Reason> SecReason { get; set; }
  public int? PrimaryId { get; set; }
  //Adds child to this reason object or any of its children/grandchildren/... identified by primaryId
  public bool addChild(int primaryId, Reason newChildNode)
  {
    if (Id.Equals(primaryId))
    {
      addChild(newChildNode);
      return true;
    }
    else
    {
      if (SecReason != null)
      {
        foreach (Reason child in SecReason)
        {
          if (child.addChild(primaryId, newChildNode))
            return true;
        }
      }
    }
    return false;
  }
  public void addChild(Reason child)
  {
    if (SecReason == null) SecReason = new List<Reason>();
    SecReason.Add(child);
  }
}
private List<Reason> GetReasonsHierarchy(List<Reason> reasons)
{
  List<Reason> reasonsHierarchy = new List<Reason>();
  foreach (Reason r in reasons)
  {
    bool parentFound = false;
    if (r.PrimaryId != null)
    {
      foreach (Reason parent in reasonsHierarchy)
      {
        parentFound = parent.addChild(r.PrimaryId.Value, r);
        if (parentFound) break;
      }
    }
    if (!parentFound) reasonsHierarchy.Add(r);
  }
  return reasonsHierarchy;
}

最新更新