0

я следующие таблицы в моей Sql Sever База данных:Flatten мастер/подробно сущность

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 для улучшения характеристик. Обычно 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) 

Вы можете получить, что эфф работает только один запрос также с помощью SelectMany, но результат запроса является список точек со свойством, что является многоугольник так в Еогеасп вам нужно извлечь группы точек тот же полигон (так, в вашем случае код будет менее понятным).

+0

Спасибо ... Я проверю его –

+0

Ваше решение сработало для меня. Теперь я собираюсь создать иерархический список из этого плоского списка. –