2012-09-19 78 views
0
public int Queue() 
    { 
     using (Entities server = new Entities()) 
     { 
      var ServerId1 = (from serverID in server.AppPM_Patches 
          where serverID.PatchStatus == "NotStarted" && serverID.ServerId == 1 
          select serverID.ServerId).Count(); 
      var ServerId2 = (from serverID in server.AppPM_Patches 
          where serverID.PatchStatus == "NotStarted" && serverID.ServerId == 2 
          select serverID.ServerId).Count(); 
      var ServerId3 = (from serverID in server.AppPM_Patches 
          where serverID.PatchStatus == "NotStarted" && serverID.ServerId == 3 
          select serverID.ServerId).Count(); 
      if (ServerId1 == 0 && ServerId2 == 0 && ServerId3 == 0) 
      { 
       return ServerId1;//Convert.ToInt32(ServerId1); 

      } 
      else if (ServerId1 == 1 && ServerId2 == 0 && ServerId3 == 0) 
      { 
       return ServerId2; 
      } 
      else if (ServerId1 == 1 && ServerId2 == 1 && ServerId3 == 0) 
      { 
       return ServerId3; 
      } 
      else if (ServerId1 > ServerId2 && ServerId1 > ServerId3) 
      { 
       if (ServerId2 > ServerId3) 
       { 
        return ServerId3; 
       } 
       else 
       { 
        return ServerId2; 
       } 
      } 
      else if (ServerId2 > ServerId3 && ServerId2 > ServerId1) 
      { 
       if (ServerId1 > ServerId3) 
       { 
        return ServerId3; 
       } 
       else 
       { 
        return ServerId1; 
       } 
      } 
      else if (ServerId3 > ServerId1 && ServerId3 > ServerId2) 
      { 
       if (ServerId1 > ServerId2) 
       { 
        return ServerId2; 
       } 
       else 
       { 
        return ServerId1; 
       } 
      } 
      else if (ServerId1 == ServerId2 && ServerId2 == ServerId3 && ServerId1 == ServerId3) 
      { 
       return ServerId1; 
      } 
      else if (ServerId1 == ServerId2 && ServerId1 > ServerId3 && ServerId2 > ServerId3) 
      { 
       return ServerId3; 
      } 
      else if (ServerId2 == ServerId3 && ServerId2 > ServerId1 && ServerId3 > ServerId1) 
      { 
       return ServerId1; 
      } 
      else if (ServerId1 == ServerId3 && ServerId1 > ServerId2 && ServerId1 > ServerId3) 
      { 
       return ServerId1; 
      } 
     } 
    } 

我在方法中得到錯誤(並非所有的代碼路徑都返回一個值)。這個方法按照我的定義返回一個int值。但不知道爲什麼這個錯誤發生,即使我已經返回一個int值。有人能幫我嗎?不是所有的代碼路徑都在c#中返回一個值#

+0

我會嘗試這個SQL的等效代碼:BY服務器ID ORDER BY COUNT(X),ServerID''... GROUP和拿第一記錄,因爲當你添加ServerID = 4,5,... n時,你所擁有的將會變得糟糕。 –

+0

+1以反擊投票。提出一個真正的問題沒有錯。 – ericosg

回答

1
public int Queue() 
     { 

       using (Entities server = new Entities()) 
       { 
int retVal=0;//initialize it your value 
        var ServerId1 = (from serverID in server.AppPM_Patches 
            where serverID.PatchStatus == "NotStarted" && serverID.ServerId == 1 
            select serverID.ServerId).Count(); 
        var ServerId2 = (from serverID in server.AppPM_Patches 
            where serverID.PatchStatus == "NotStarted" && serverID.ServerId == 2 
            select serverID.ServerId).Count(); 
        var ServerId3 = (from serverID in server.AppPM_Patches 
            where serverID.PatchStatus == "NotStarted" && serverID.ServerId == 3 
            select serverID.ServerId).Count(); 
        if (ServerId1 == 0 && ServerId2 == 0 && ServerId3 == 0) 
        { 
         retVal=ServerId1;//Convert.ToInt32(ServerId1); 

        } 
        else if (ServerId1 == 1 && ServerId2 == 0 && ServerId3 == 0) 
        { 
         retVal=ServerId2; 
        } 
        else if (ServerId1 == 1 && ServerId2 == 1 && ServerId3 == 0) 
        { 
         retVal=ServerId3; 
        } 
        else if (ServerId1 > ServerId2 && ServerId1 > ServerId3) 
        { 
         if (ServerId2 > ServerId3) 
         { 
          retVal= ServerId3; 
         } 
         else 
         { 
          retVal=ServerId2; 
         } 
        } 
        else if (ServerId2 > ServerId3 && ServerId2 > ServerId1) 
        { 
         if (ServerId1 > ServerId3) 
         { 
          retVal=ServerId3; 
         } 
         else 
         { 
          retVal=ServerId1; 
         } 
        } 
        else if (ServerId3 > ServerId1 && ServerId3 > ServerId2) 
        { 
         if (ServerId1 > ServerId2) 
         { 
          retVal=ServerId2; 
         } 
         else 
         { 
          retVal=ServerId1; 
         } 
        } 
        else if (ServerId1 == ServerId2 && ServerId2 == ServerId3 && ServerId1 == ServerId3) 
        { 
         retVal=ServerId1; 
        } 
        else if (ServerId1 == ServerId2 && ServerId1 > ServerId3 && ServerId2 > ServerId3) 
        { 
         retVal=ServerId3; 
        } 
        else if (ServerId2 == ServerId3 && ServerId2 > ServerId1 && ServerId3 > ServerId1) 
        { 
         retVal=ServerId1; 
        } 
        else if (ServerId1 == ServerId3 && ServerId1 > ServerId2 && ServerId1 > ServerId3) 
        { 
         retVal=ServerId1; 
        } 

     return retVal; 
       } 
     } 
1

你沒有其他情況,所以你沒有涵蓋所有情況。你可能在邏輯上涵蓋了所有的情況,但在句法上你沒有。因此,也許你可能想返回第一個服務器ID,只是添加

else 
{ 
    return ServerId1; 
} 
0

如果else if S的未至少一個或if都滿足,那麼就沒有「默認」的回報。

在最後加上return,或將最後的else if更改爲else

0

如果到達函數的末尾,那麼您還沒有返回任何東西。

5

您有一個if和一堆else if語句,但您沒有else語句。就編譯器而言,完全可以想象,將不滿足if條件。在這種情況下,該方法沒有返回值。

您可以返回else語句中的值,或者通常在if構造之後返回值。或者,如果代碼應該確實從不退出if語句而不滿足任何條件,那麼您可以在該方法的結尾處​​引發異常以表明存在錯誤。一個例外是一種可接受的方法退出策略。

3

在這裏有很多其他的答案是解決你的具體錯誤信息,但是你的方法有更多的潛在問題被忽略。你有一系列巨大的if/else if語句,它們非常長且複雜,僅僅返回3個整數的最小值。有更多的這樣做的更簡單的方法。用最少的重構的方法將你的查詢後,立即添加以下內容:

return new[] { ServerId1, ServerId2, ServerId3 }.Min(); 

但是,您可以重構查詢本身,所以你只執行一個查詢,而不是三個,也不要硬編碼在三個不同的服務器ID中。這將允許您更換裏面的一切using有:

return (from serverID in server.AppPM_Patches 
where serverID.PatchStatus == "NotStarted" 
group serverID by serverID.ServerId into servers 
select servers.Count()) 
.Min(); 
+0

你比較好。刪除我的。 –

相關問題