首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单次输出多表的Linq查询

单次输出多表的Linq查询
EN

Stack Overflow用户
提问于 2019-03-05 22:10:39
回答 2查看 126关注 0票数 0

我的表格如下所示

代码语言:javascript
复制
ID | Reason | PrID
----------------- 
1   abc      null
2   dhe      null
3   aerc      1
4   dwes      2
5   adfje     1

我有课

代码语言:javascript
复制
 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为空,我希望它在层次结构级别中显示,需要将其视为父对象保留所有子对象

我正在尝试Linq,但无法实现这一点

建议我如何在linq中以一种简单的方式完成此操作

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-05 23:16:26

因此:您有一个list/enumerable类型,其中的SecReason List属性为null。然后,使用linq你想要一个列表,是不是只有“根”原因仍然存在,但是子原因被放到了列表中,但是作为类型SecondaryReason?如果是这样,我找到了这样的方法(linq和foreach):

代码语言:javascript
复制
    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,但更难理解:

代码语言:javascript
复制
  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
EN

Stack Overflow用户

发布于 2019-03-06 14:58:42

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

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55004761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档