私は、次のクエリを持っている:Linq2Sql:クエリ - サブクエリの最適化
IList<InfrStadium> stadiums =
(from sector in DbContext.sectors
where sector.Type=typeValue
select new InfrStadium(sector.TeamId)
).ToList();
とInfrStadiumクラスのコンストラクタ:
private InfrStadium(int teamId)
{
IList<Sector> teamSectors = (from sector in DbContext.sectors
where sector.TeamId==teamId
select sector)
.ToList<>();
... work with data
}
現在の実装では、n 1つの+ n個のクエリ、実行 - レコード数がフェッチを1回目。
私はそれを最適化したいと思います。
そして、私はこのような方法で、「グループ」演算子を使用して行うのが大好きだ別の1:適切なコンストラクタを持つ
IList<InfrStadium> stadiums =
(from sector in DbContext.sectors
group sector by sector.TeamId into team_sectors
select new InfrStadium(team_sectors.Key, team_sectors)
).ToList();
:
private InfrStadium(int iTeamId, IEnumerable<InfrStadiumSector> eSectors)
{
IList<Sector> teamSectors = eSectors.ToList();
... work with data
}
しかし、クエリは次のようなエラーが発生し起動しよう:
Expression of type 'System.Int32' cannot be used for constructor parameter of type 'System.Collections.Generic.IEnumerable`1[InfrStadiumSector]'
質問1:
ここで何が間違っているのか説明してください。「team_sectors」が「System.Int32」として適用される理由を理解できませんか?
IList<InfrStadium> stadiums =
(from sector in DbContext.sectors
group sector by sector.TeamId into team_sectors
select new InfrStadium(team_sectors.Key, team_sectors.AsQueryable())
).ToList();
適切なコンストラクタで:
私は、クエリ少しは(IQueryeableとIEnumerableを置き換える)を変更しようとしました
private InfrStadium(int iTeamId, IQueryeable<InfrStadiumSector> eSectors)
{
IList<Sector> teamSectors = eSectors.ToList();
... work with data
}
この場合、私は別のが、同様のエラーを受信しました:
Expression of type 'System.Int32' cannot be used for parameter of type 'System.Collections.Generic.IEnumerable
1[InfrStadiumSector]' of method 'System.Linq.IQueryable
1[InfrStadiumSector] AsQueryableInfrStadiumSector'
質問2:実際
、同じ質問:ここで何が起きているのか全く理解できない...
P.S. 私は質問のアイデアを最適化する別の方法があります(ここで説明する:Linq2Sql: query optimisation)が、DBへの1つのリクエストで解決策を見つけるのが大好きです。
上記のコードを実装しましたが、あなたが言及したエラーは発生しませんでした。私は2つの構文エラーを修正しなければならなかったので、コードを正しくコピーしていないと思われます。あなたがコンストラクタ内で仕事をしている理由を教えてください。それは悪い習慣です。 David Bの答えはいいと思います。 – Enigmativity
おそらく私の側の問題の理由は、DBにアクセスするためにはlinq2sqlを使用しますが、IQueryableインターフェイスへのアクセスを提供するBLToolkitフレームワークです。フレームワークの所有者と対話しようとします。 – Budda
工作後にオブジェクトを完全に初期化したいので、Enigmativity、コンストラクタでの処理を行います。コンストラクタ内での作業が悪い習慣である理由を教えてください。 – Budda