0

を平らに次の方法を使用して各ポリゴンとその点を読み取る。は私が私のSql Severのデータベースで次のテーブルを持っているマスター/ディテールエンティティ

テーブルには約20000のポリゴンがあります。 上記のコードが長すぎて完全に実行できません。 データを平坦化しようとしていたとき、内側のForEachループを削除できます。 SelectManyは私の問題を解決しますか?はい任意の提案は

多くのおかげ

+0

モデルは明確ではありませんが、AsNoTracking、Includeを挿入できます。また、Selectを使用してパフォーマンスを向上させることもできます。通常、AsNoTrackingとIncludeで十分です。 – bubi

+0

あなたの応答をありがとうが、AsNoTrackingを追加しても効果はありません。私はちょうどtbl_polygonsからポリゴンを読んでから、効果的な方法でlinqを使ってtbl_polygonpointsからその点を求めます –

答えて

1

を高く評価している場合、これはコメントする必要がありますが、それはあまりにも長いです。

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の中で、あなたがのポイントのグループを取得する必要があるので、クエリの結果は、多角形であるプロパティを持つ点のリストです同じポリゴン(したがって、あなたの場合、コードはあまり明確ではありません)。

+0

ありがとう...私はそれを確認します –

+0

あなたのソリューションは私のために働いた。今度は、このフラットリストから階層リストを作成します。 –

関連する問題