を平らに次の方法を使用して各ポリゴンとその点を読み取る。は私が私のSql Severのデータベースで次のテーブルを持っているマスター/ディテールエンティティ
テーブルには約20000のポリゴンがあります。 上記のコードが長すぎて完全に実行できません。 データを平坦化しようとしていたとき、内側のForEachループを削除できます。 SelectManyは私の問題を解決しますか?はい任意の提案は
多くのおかげ
を平らに次の方法を使用して各ポリゴンとその点を読み取る。は私が私のSql Severのデータベースで次のテーブルを持っているマスター/ディテールエンティティ
テーブルには約20000のポリゴンがあります。 上記のコードが長すぎて完全に実行できません。 データを平坦化しようとしていたとき、内側のForEachループを削除できます。 SelectManyは私の問題を解決しますか?はい任意の提案は
多くのおかげ
を高く評価している場合、これはコメントする必要がありますが、それはあまりにも長いです。
IncludeにはSelectManyと同じ効果がありますが、20.000クエリは避けてください。どちらの場合も、ナビゲーションプロパティを持つモデルが必要です。インクルードを使用すると、コードは通常より明確になります。
次に、2番目の最適化は、複数のエンティティをコンテキストに追加しないようにAsNoTrackingを挿入することです。あなたのケースでは、まずデータベースからコードを使用して、データベースから始めてモデルを書くことができます。このモデル(C#の程度申し訳ありませんが、私はVBを読み取ることができますが、私はそれを書くことはできません)
[Table("Tbl_Polygons")]
class Polygon
{
[Key]
public int PolygonId {get; set;}
public string PolygonName {get; set;}
public virtual ICollection<Point> Points {get; set;}
}
[Table("Tbl_PolygonPoints")]
public Point
{
[Key]
public int PointId {get; set;}
public int Latitude {get; set;}
public int Lontitude {get; set;}
[ForeignKey("Fk_PolygonId")]
public virtual Polygon Polygon {get; set;}
public int Fk_PolygonId {get; set;}
}
では、あなたのコードは、これになります。あなたはそのEFを得ることができ
var polygons = context.Polygons.Include(p => p.Points).AsNoTracking().ToList();
foreach (var polygon in polygons)
DrawPolygon(polygon, polygon.Points)
もSelectManyを使用して1つだけのクエリを実行しますが、foreachの中で、あなたがのポイントのグループを取得する必要があるので、クエリの結果は、多角形であるプロパティを持つ点のリストです同じポリゴン(したがって、あなたの場合、コードはあまり明確ではありません)。
ありがとう...私はそれを確認します –
あなたのソリューションは私のために働いた。今度は、このフラットリストから階層リストを作成します。 –
モデルは明確ではありませんが、AsNoTracking、Includeを挿入できます。また、Selectを使用してパフォーマンスを向上させることもできます。通常、AsNoTrackingとIncludeで十分です。 – bubi
あなたの応答をありがとうが、AsNoTrackingを追加しても効果はありません。私はちょうどtbl_polygonsからポリゴンを読んでから、効果的な方法でlinqを使ってtbl_polygonpointsからその点を求めます –