2

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

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

请帮忙。

4

3 回答 3

2

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

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

看:

于 2013-01-17T07:19:58.720 回答
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;
}

或递归地

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;
}
于 2013-01-17T07:49:40.933 回答
0

你需要使用不同的模式。

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

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();
于 2013-01-17T07:22:14.957 回答