Linq查询单列中的Multi列表

时间:2019-03-05 14:10:39

标签: c# linq

我的表格如下所示

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; }
}

我希望将其显示在层次结构级别中 如果优先级为Null,则需要将其视为剩余所有子项的父项

我正在尝试Linq,却无法实现

建议我如何在linq中轻松实现此目的

2 个答案:

答案 0 :(得分:1)

因此:您具有类型的列表/枚举,其中SecReason List属性为null。然后,使用linq想要一个列表,只是“根本”原因仍然存在,但是子原因被放入列表中,但类型为SecondaryReason? 如果是这样,我发现可以这样做(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;
            });

答案 1 :(得分:1)

不确定linq是否会是最好的解决方案,这是我建议的更改和获取层次结构类型的方法:

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;
}