2017-05-30 69 views
0

我有一個函數如下:功能並非所有的代碼路徑返回一個值

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id; 

      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId; 

       } 
       else 
       { 
        return 0; 
       } 

      } 

     } 
     return 0; 
    } 
} 

在這裏,我得到一個錯誤說不是所有的代碼路徑返回一個值。我在想什麼,在哪裏?

+5

如果它沒有進入for循環,那麼它將如何返回。您需要在for循環之外返回 – Nkosi

+0

當沒有用戶時它不返回 – Mafii

+0

寫返回0;外部foreach循環 –

回答

2

將最外層的迴路移出迴路。如果用戶列表爲空,則永遠不會輸入循環。然後沒有回報受到打擊。

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id; 

      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId; 

       } 
       else 
       { 
        return 0; 
       } 

      } 

     } 

    } 

    return 0; 
} 
4

將引發錯誤,因爲你的功能的情況下不返回任何東西你沒有進入你的foreach聲明。當你的函數返回一個long的值時,你需要返回任何情況下函數結尾的值。我認爲問題在於你錯位了你的第二個回報,它應該在foreach循環之外。

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id; 

      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId; 

       } 
       else 
       { 
        return 0; 
       } 

      } 

     } 
    } 
    return 0; // 0 will be returned in any case if you reach the end of the function 
} 

你可能不得不小心你當前的邏輯。如果你的用戶的第一個利益相關者不是好的,你直接返回0,而不是檢查其他的。只有當您的利益相關者ID都不對應您正在查找的人時,纔可能要放置您的return 0。把它放在那裏是很好的,因爲你不需要檢查其他用戶,並且可以直接退出該功能。

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id; 

      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId; 

       } 
      } 

      return 0; // If none of the stakeholder ID correspond to the one you are looking for, it means it doesn't exist. You can return 0 directly there. 
     } 
    } 
    return 0; // This part of code will be reached if the user is not found. 
} 
+1

好吧,伊蘇卡。 – Mafii

+1

利益相關者DbSet的foreach意味着你將在數據庫上做一個「從利益相關者中選擇*」,你不應該這樣做。 –

1

您應該返回一個值作爲錯誤說,外循環返回值,

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id; 

      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId; 

       } 
       else 
       { 
        return 0; 
       } 

      } 

     } 

    } 

    return 0; 
} 
2

它可能無法進入for循環,以便將其更改爲:

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id; 

      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId; 

       } 
       else 
       { 
        return 0; 
       } 

      } 

     } 
     return 0; 
    } 
    //Missing RETURN 
    return 0; 
} 
2

正如其他人所說的,錯誤是因爲在沒有用戶的情況下你錯過了回報(所以它不會進入foreach循環)。然而,你的函數也有其他錯誤:

  • if (user.Email == currentUserId) { } return 0;
    • 這裏您強制,要麼在循環中的第一個用戶擁有您正在尋找的電子郵件,或返回0
  • if (stakeholder.IdentityId == idForStakeholder) { } else return 0;
    • 在這裏,你迫使要麼第一利益相關者有您正在尋找的標識,否則將返回0

使用LINQ,可以簡化您的整個方法,只是這一點:

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var user = _userManager.Users 
     .Where(u => u.Email == currentUserId) 
     .FirstOrDefault(); // get only the wanted user 
    if (user == null) 
    { 
     return 0; 
    } 

    var stakeholder = _context.Stakeholders 
     .Where(s => s.StakeholderId == user.IdentityId) 
     .FirstOrDefault(); // get only the wanted stakeholder from the database 

    return stakeholder == null ? 0 : stakeholder.StakeholderId; 
} 

你也應該提防的是通過在DbSet財產使用foreach意味着你正在做的一個select * from table數據庫。您應該使用LinQ過濾數據庫中的集合,而不是在in-memoy中進行。

2

如此多的快速解答,但是我已經注意到在給定的代碼中存在邏輯問題(不確定是否是您的方案的問題)。循環中只有變量stakeholders中的值將只執行一次。這意味着如果條件stakeholder.IdentityId == idForStakeholder滿足該方法將返回相應的ID否則它將返回0,因此它跳過執行stakeholders中的其餘值(如果您可以跳過這些值,請忽略此項)。如果要繼續檢查集合中的所有項目,那麼你可以使用下面的代碼:

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId = 0; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id;  
      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId;  
       } 
      } 

     } 
    }  
    return stakeholderId; 
} 

現在,這個方法會檢查相關人士對所有用戶的所有值,並且將返回stakeholderId滿足條件(stakeholder.IdentityId == idForStakeholder),否則返回全部循環後的0。現在你也從這個錯誤中解脫出來了。開始循環前請不要忘記用0初始化stakeholderId;

+1

我想這是一個更好的解決方案,因爲即使他們發現匹配,其他人總是返回0 – Nitish

相關問題