2010-09-02 57 views
0

我有一個名爲Game的表,其中有4列用於玩家ID。我也有一個名爲Player的表格。當我嘗試計算一名玩家所在的所有遊戲時,我只能從Game表中的第一列中獲得玩家。LINQ到SQL不包括所有列

player.Games.Count(); 

我已經爲所有表設置了外鍵,並且它在表設計器中正確顯示。從下面的圖片,你可以看到,它應該從藍天+ 2計數和RED1 + 2,但它只能從Blue1計數......

alt text

我也試圖創建一個方法來手動選擇所有遊戲:

public int GetPlayerGames(int playerID) 
{ 
    return (from game in db.Games 
      where game.Blue1 == playerID 
      || game.Blue2 == playerID 
      || game.Red1 == playerID 
      || game.Red2 == playerID 
      select game).Count(); 
} 

但是,當我使用LINQ查詢裏面

return from player in db.Players 
     where GetPlayerGames(player.ID) > 0 
     select player; 

我得到這個錯誤:
Method 'Int32 GetPlayerGames(Int32)' has no supported translation to SQL.

+0

貌似玩呃是一對多的關係。在你的遊戲記錄中,是否有一個記錄所有玩家ID值都被填充? – 2010-09-02 10:55:44

回答

0

其實,我結束了使用上述方法,但只是投放它以一個列表第一:

return from player in db.Players.ToList() 
     where GetPlayerGames(player.ID) > 0 
     select player; 
+0

請確保您知道「只是將其轉換爲列表」的後果。調用db.Players.ToList()進入數據庫並將整個數據庫表提取到內存中,然後在代碼中應用過濾。這可能不是你想要的:當玩家數量變大時它不會很好地擴展...... – 2010-09-02 13:47:46

+0

是的。我知道。就目前而言,我相當確定名單不會超過20名球員。但是你是對的,它不會很好地擴展。因此,直到我找到一種好的方法來編寫linq理解的方法時,我會保持這種方式,同時要記住,我將不得不在稍後重構。 – peirix 2010-09-02 14:27:57

1

如果您已設置了四個關係,他們會各自有不同的名稱,最有可能的GamesGames1Games2Games3。通過這樣做player.Games.Count()你只計算與第一關係相關的遊戲,你需要添加額外的計數由其他關係相關的遊戲:

var allGameCounts = player.Games.Count() + player.Games1.Count() + player.Games2.Count() + player.Games3.Count(); 
0

如果你想要做的SQL中的過濾,而無需加載整個數據庫,你可以這樣做......

from player in db.Players 
where player.Games.Any() 
    || player.Games1.Any() 
    || player.Games2.Any() 
    || player.Games3.Any() 
select player