【问题标题】:Recursive self join递归自连接
【发布时间】:2013-01-17 07:07:50
【问题描述】:

我有如下表格。我需要为提供的用户 ID 获取所有经理 ID。

userid managerid
10     1
9      10
6      9
2      6
4      1

如果我将 2 传递给我的方法,我需要得到 1、10、9 和 6。我编写了以下查询,它将仅返回第一级父级。即它只会返回 6 和 9。

public List<int?> mymethod (int userId){

return (from e in mycontext.EmployeeManagers
                     join e1 in m_context.EmployeeManagers
                        on e.UserId equals e1.ManagerId
                    where e1.UserId == userId
                     select e1.ManagerId).AsQueryable().ToList()
}

如何修改查询以返回所有经理雇佣?

请帮忙。

【问题讨论】:

标签: c# linq-to-sql


【解决方案1】:

您不能在 sinqle LINQ 表达式中执行此操作。你必须循环运行它。

更好的选择是在数据库中执行此操作,然后将结果返回给 LINQ。

见:

【讨论】:

【解决方案2】:

我会简单地运行一个像这样的短循环(抱歉大写无效,从头开始编码):

public List<Int> GetAllManagers(int userID)
{
  var result = new List<int>();
  int index = 0;
  result.add(userID); // start with user (it will be removed later)
  while (index < result.count)
  {
    var moreData = from e in mycontext.EmployeeManagers
                    where e.UserId == result[index];
                     select e.ManagerId;
    foreach (int id in moreData)
      if (result.indexOf(id)==-1)
        result.add(id);
    index++;
  }
  result.delete(0);
  return result;
}

或递归

private void AddUniqueIds (List<int> elements, ref List<int> list)
{
  foreach (int id in elements)
    if (list.indexOf(id)==-1)
      list.add(id);
}
public List<int> GetAllManagers(int userID)
{
  var result = new List<int>();
  var moreData = from e in mycontext.EmployeeManagers
                 where e.UserId == result[index];
                 select e.ManagerId;

  foreach (int id in moreData)
    AddUniqueIds(result, GetAllManagers(id));

  return result;
}

【讨论】:

    【解决方案3】:

    你需要使用不同的模式。

    让我们看看你得到了你的查询。

    var query = myContext.EmployeeManagers
    

    然后,您可以随意join

    for(int = 0; i < 5; i++)
    {
        query = query.Join( ... ..., i, ... ); // Can't recall all
                                               // the parameters right now.
    }
    

    然后执行它:

    var result = query.ToList();
    

    【讨论】:

    • 请注意,这需要您知道最大深度级别,但情况并非总是如此。
    • -1 这个神奇的 5 是从哪里来的?您希望如何通过多次连接返回一个列表?我希望这会在一个结果中返回 j1.managerid、j2.managerid、j3.managerid...。
    • @Gregory 不知道最大深度将导致 stackoverflow 异常。
    • @Jacco 这是循环多个连接的示例。
    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多