編集#2:質問は途中で解決しました。下を見てください
フォローアップの質問として、私が以下でやろうとしていることを解決するための邪魔にならない方法を知っている人はいますか (つまり、無限ループをトリガーせずにオブジェクトを相互にリンクします)?
asp.net-mvc Web アプリケーションを作成しようとすると、StackOverFlowException が発生します。コントローラーは次のコマンドをトリガーします。
public ActionResult ShowCountry(int id)
{
Country country = _gameService.GetCountry(id);
return View(country);
}
GameService は次のように処理します (WithCountryId は拡張機能です)。
public Country GetCountry(int id)
{
return _gameRepository.GetCountries().WithCountryId(id).SingleOrDefault();
}
GameRepository は次のように処理します。
public IQueryable<Country> GetCountries()
{
var countries = from c in _db.Countries
select new Country
{
Id = c.Id,
Name = c.Name,
ShortDescription = c.ShortDescription,
FlagImage = c.FlagImage,
Game = GetGames().Where(g => g.Id == c.GameId).SingleOrDefault(),
SubRegion = GetSubRegions().Where(sr => sr.Id == c.SubRegionId).SingleOrDefault(),
};
return countries;
}
GetGames() メソッドにより、StackOverflowException が発生します。
public IQueryable<Game> GetGames()
{
var games = from g in _db.Games
select new Game
{
Id = g.Id,
Name = g.Name
};
return games;
}
私のビジネス オブジェクトは linq2sql クラスとは異なります。そのため、それらに select new を入力します。
タイプ 'System.StackOverflowException' の未処理の例外が mscorlib.dll で発生しました
編集#1:犯人を見つけました。それは次のメソッドです。GetCountries()メソッドをトリガーし、その代わりにGetSubRegions()を再びトリガーします。
public IQueryable<SubRegion> GetSubRegions()
{
return from sr in _db.SubRegions
select new SubRegion
{
Id = sr.Id,
Name = sr.Name,
ShortDescription = sr.ShortDescription,
Game = GetGames().Where(g => g.Id == sr.GameId).SingleOrDefault(),
Region = GetRegions().Where(r => r.Id == sr.RegionId).SingleOrDefault(),
Countries = new LazyList<Country>(GetCountries().Where(c => c.SubRegion.Id == sr.Id))
};
}
ここで何か他のことを考えなければならないかもしれません:)コーヒーが多すぎるためにオブジェクト指向の考え方で考えると、それが起こります