展平 master/detail 个实体

Flatten master/detail entity

我的 Sql 服务器数据库中有以下 table:

Tbl_Polygons: 多边形ID, 多边形名称

Tbl_PolygonPoints: 点号, 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

我的 table 中有大约 20000 个多边形。 上面提到的代码花了太长时间 运行 完全。 我试图展平我的数据,然后我可以删除我的内部 ForEach 循环。 SelectMany 会解决我的问题吗?如果有任何建议,我们将不胜感激

非常感谢

这应该是一条评论,但它太长了。

Include 与 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 获得 ef 仅运行 1 个查询,但查询的结果是一个点列表,其中 属性 是多边形,因此在 foreach 中您需要检索组同一多边形的点(因此,在您的情况下,代码将不太清楚)。