我有一張表格,列出了員工及其主管的名單。
| UserID | SupervisorUserId |
|--------|------------------|
| 10 | null |
| 1 | 10 |
| 2 | 1 |
| 3 | 1 |
| 4 | 3 |
| 5 | 10 |
| 6 | 5 |
| 7 | 6 |
| 8 | 6 |
| 9 | 8 |
這是一個可視化圖表:
員工層次結構圖
這就是我現在所擁有的:
public JsonResult GetEmployeesWithReportingLevel()
{
try
{
var getEmployees = GetEmployees().ToList();
var employeeList = (from e in getEmployees
where e.IsDeleted != true
select new ReportingLineList
{
UserId = e.UserId,
SupervisorId = e.SupervisorId
}).ToList();
var reportingLevel = (from emp in employeeList
select new
{
UserId = emp.UserId,
ReportingLevel = GetReportingLevel(employeeList, emp.UserId, 0)
}).ToList();
return new JsonResult(reportingLevel);
}
catch
{
throw;
}
}
private int GetReportingLevel(IEnumerable<ReportingLineList> employeeList, Guid UserId, int reportingLevel)
{
try
{
var reportingEmployees = (from emp in employeeList
where emp.SupervisorId == UserId
select new
{
UserId = emp.UserId
}).ToList();
foreach (var emp in reportingEmployees)
{
if (emp.UserId != null)
{
return GetReportingLevel(employeeList, (Guid)emp.UserId, reportingLevel 1);
}
}
return reportingLevel;
}
catch
{
throw;
}
}
我的預期結果應該是:
| UserId | Reporting level |
|--------|-----------------|
| 2 | 0 |
| 4 | 0 |
| 7 | 0 |
| 9 | 0 |
| 3 | 1 |
| 8 | 1 |
| 1 | 2 |
| 6 | 3 |
| 5 | 3 |
| 10 | 4 |
根據我目前的結果,它似乎只是在迭代我的代碼將獲得的第一個員工。
這是我得到的結果。
| UserId | Reporting level |
|--------|-----------------|
| 2 | 0 |
| 4 | 0 |
| 7 | 0 |
| 9 | 0 |
| 3 | 1 |
| 8 | 1 |
| 1 | 1 |
| 6 | 1 |
| 5 | 2 |
| 10 | 3 |
uj5u.com熱心網友回復:
首先,您說您希望 UserId 6 的報告級別為 3,但如果我理解這個問題,那么資料和圖表都會建議它應該是 2。
如果這是正確的,那么問題出在您的 GetReportingLevel 方法上。您需要同時跟蹤 currentLevel 和 MaximumReportingLevel。每次下降一個級別時,您需要增加 currentLevel,然后在完成該級別后再次降低它,這需要獨立于 MaximumReportingLevel,只有在找到比以前更深的級別時才應該更改。
例如,當您處理員工 10 時,您遞回地在級別 1 上處理員工 1,然后在級別 2 上處理員工 2,但是您需要回傳到級別 1 來處理員工 3,同時又不會丟失您的最高級別為 2 的事實.
您的代碼也無法為我編譯,例如 UserID 是 int 還是 Guid 等,但我認為以下應該有效(我故意嘗試將您的大部分代碼保留原樣)
private int GetReportingLevel(IEnumerable<ReportingLineList> employeeList, Guid UserId,
int MaxReportingLevel = 0, int CurrentLevel = 0)
{
try
{
var reportingEmployees = (from emp in employeeList
where emp.SupervisorId == UserId
select new
{
UserId = emp.UserId
}).ToList();
CurrentLevel ;
foreach (var emp in reportingEmployees)
{
if (emp.UserId != null)
{
int newLevel = GetReportingLevel(employeeList, (Guid)emp.UserId,
MaxReportingLevel , CurrentLevel);
MaxReportingLevel = Math.Max(currentLevel, newLevel);
}
}
CurrentLevel--;
return MaxReportingLevel;
}
catch
{
throw;
}
}
uj5u.com熱心網友回復:
所以我也有點新,但.OrderBy()如果我沒記錯的話,你的問題似乎可以通過添加一個來解決。
這是一個檢查它的鏈接:MSDN Enumerable.OrderBy Method
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/478173.html
下一篇:無法翻譯LINQ運算式。通過插入對“AsEnumerable”、“AsAsyncEnumerable”、“ToList”的呼叫來顯式評估客戶端
