递归自联接

时间:2013-01-17 07:07:51

标签: c# linq-to-sql

我有如下表格。我需要为所提供的用户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()
}

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

请帮忙。

3 个答案:

答案 0 :(得分:2)

你不能在一个sinqle LINQ表达式中这样做。你必须循环运行它。

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

见:

答案 1 :(得分:1)

我只是像这样运行一个短循环(抱歉无效大写,从头开始编码):

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

或recursevly

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

答案 2 :(得分:-1)

您需要使用不同的模式。

让我们看看你的问题。

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