LINQ - 从带有循环引用的表中加载数据

时间:2013-06-14 10:41:43

标签: .net vb.net linq entity-framework linq-to-entities

我有下表,其中StationAvailableMoves.StationID和StationAvailableMoves.AvailableNextStationID在Station.ID列上都有关系。

我用这个来控制从站对象到站对象的进程,其中站可以有多条路径。

enter image description here

当我将这些表导入Entity Framework模型时,我得到以下循环参考表。

enter image description here

然后我尝试在下面的DTO中加载数据

Imports System.Runtime.Serialization

Namespace Models

    <DataContract()>
    Public Class Stations

        <DataMember()>
        Public Property ID As Int32

        <DataMember()>
        Public Property Name As String

        <DataMember()>
        Public Property BullName As String

        <DataMember()>
        Public Property StationMoves As IList(Of Stations)

    End Class

End Namespace

虽然我可以使用下面的LINQ查询将数据加载到基元类型中,但我不确定如何加载调用中遇到的子对象。

    Using db As New StockTrackingEntities

        Dim var = (From s In db.Stations.Where(Function(w) w.BUID.Equals(buID))
                    Select New Stations With {.ID = s.ID,
                                              .Name = s.Name,
                                              .BullName = s.BullName}).ToList

    End Using

我可以在单个LINQ语句中执行此操作,还是需要在集合中使用For Each并手动加载它?

修改

我已经尝试过以下语句(可能是垃圾)并且在编译时会生成运行时异常

       Dim var = (From s In db.Stations.Where(Function(w) w.BUID.Equals(buID))
                    Select New Stations With {.ID = s.ID,
                                              .Name = s.Name,
                                              .BullName = s.BullName,
                                              .StationMoves = From m In s.Station1
                                                              Select New Stations With {.ID = m.ID,
                                                                                        .Name = m.Name,
                                                                                        .BullName = m.BullName}}).ToList

异常

enter image description here

从上面的查询中删除ToList以防止它实际评估它的例外情况。

enter image description here

1 个答案:

答案 0 :(得分:0)

您的ToList映射上似乎缺少对StationMoves的调用。此外,如果您知道将要访问StationMoves属性,您可以急于加载它,例如

(From s In db.Stations.Include("StationMoves").Where(Function(w) w.BUID.Equals(buID))
Select New Stations With {.ID = s.ID,
                          .Name = s.Name,
                          .BullName = s.BullName,
                          .StationMoves = s.StationMoves.ToList }).ToList