0

我已經在我的SQL Sever的數據庫下表:拼合主/從實體

Tbl_Polygons: PolygonId, PolygonName

Tbl_PolygonPoints: 點名, Fk_PolygonId, 緯度, 經度 我m使用以下方法讀取每個多邊形,然後讀取它的點:

Using context = New myDbEntities() 
Dim polygons = (From poly In context.Tbl_Polygons Select Poly).ToList() 

polygons.ForEach(Sub(ply) 
          Dim polyPoint = (From pPoint In Tbl_PolygonPoints Where pPoint.Fk_PolygonId = ply.PolygonId 
               Select pPoint.Latitude, pPoint.Longitude).ToList() 


          polyPoint.ForEach(Sub(pPoint) 
                polygonPoints.Add(New PointLatLng(pPoint.Latitude, pPoint.Longitude)) 
               End Sub) 

          DrawPolygon(ply,polygonPoints) 
          polygonPoints.Clear() 
         End Sub) 
End Using 

我的桌子上有大約20000個多邊形。 上面提到的代碼需要很長時間才能完全運行。 我試圖壓扁我的數據,然後我可以刪除我的內部ForEach循環。 SelectMany會解決我的問題嗎?如果是的任何建議都讚賞

千恩萬謝

+0

不管怎樣,你可以插入AsNoTracking,Include,還可以選擇Flatten來提高性能。通常AsNoTracking和Include就足夠了。 – bubi

+0

感謝您的回覆,但添加AsNoTracking並沒有標記效果。我只想從tbl_polygons讀取多邊形,然後從tbl_polygonpoints使用linq以有效的方式讀取多邊形 –

回答

1

這應該是一個評論,但它太長了。

包含與SelectMany具有相同的效果,您可以避免20.000個查詢。在這兩種情況下,您都需要具有導航屬性的模型。如果使用Include,代碼通常會更清晰。
然後,第二次優化將插入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;} 
} 

你的代碼就是這樣。

var polygons = context.Polygons.Include(p => p.Points).AsNoTracking().ToList(); 
foreach (var polygon in polygons) 
    DrawPolygon(polygon, polygon.Points) 

,可以獲取用於EF僅運行1查詢還使用的SelectMany但查詢的結果是與屬性點的列表是多邊形所以在foreach您需要檢索點的組相同的多邊形(所以,在你的情況下,代碼將不太清晰)。

+0

謝謝...我將檢查它 –

+0

您的解決方案適用於我。現在我要從這個平面列表構建分層列表。 –