0

내 SQL을 끊어 데이터베이스에서 다음 표했다 :펼치기 마스터/세부 엔티티

Tbl_Polygons : PolygonId, PolygonName이

Tbl_PolygonPoints : pointId, Fk_PolygonId, 위도, 경도 나 ' 다음 방법을 사용하여 각 다각형과 그 점을 읽습니다.

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를 삽입하고 Select with flatten을 사용하여 퍼포먼스를 향상시킬 수 있습니다. 일반적으로 AsNoTracking 및 Include이면 충분합니다. – bubi

+0

응답 해 주셔서 고맙겠 습니다만 AsNoTracking을 추가하면 마킹 효과가 없습니다. 난 그냥 tbl_polygons에서 다각형 읽기 다음 효과적인 방법으로 linq와 tbl_polygonpoints에서 자사의 포인트 –

답변

1

을 평가하는 경우에 코멘트를해야하지만 너무 오래입니다.

Include에는 SelectMany와 동일한 효과가 있으므로 20.000 개의 쿼리를 피할 수 있습니다. 두 경우 모두 네비게이션 속성이있는 모델이 필요합니다. 포함을 사용하면 코드가 더 명확합니다.
그런 다음 두 번째 최적화는 여러 엔티티를 컨텍스트에 추가하지 않으려는 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를 얻을 수는 SelectMany하지만 쿼리의 결과를 사용하는 경우에만 1 쿼리가 당신의 포인트의 그룹을 검색하는 데 필요한 foreach는 그렇게 다각형 인 속성 점의 목록입니다 실행 같은 다각형 (그래서, 당신의 경우에는 코드가 덜 명확합니다).

+0

고마워 ... 내가 그것을 확인합니다 –

+0

귀하의 솔루션 나를 위해 일했습니다. 이제이 평면 목록에서 계층 구조 목록을 작성하겠습니다. –