【问题标题】:LINQ - loading data from tables with circular referencesLINQ - 从具有循环引用的表中加载数据
【发布时间】:2013-06-10 23:50:06
【问题描述】:

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

我正在使用它来控制从车站对象到车站对象的过程,其中车站可以有多个路线。

当我将这些表导入实体框架模型时,我得到以下循环引用表。

然后我尝试在下面的 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

例外

从上面的查询中删除 ToList 以防止异常它实际评估它的打击对象。

【问题讨论】:

  • 通过迭代集合让它工作了,但仍然想知道它在 LINQ 中是否可行。

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


【解决方案1】:

您的StationMoves 映射中似乎缺少对ToList 的调用。此外,如果您知道 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

【讨论】:

  • 不起作用。创建了一个运行时异常“LINQ to Entities 无法识别方法 'System.Collections.Generic.List1'。不要认为它会起作用,因为实体对象与 DTO 模型对象不同。
  • @PhilMurray 啊,是的,当然。由于您需要将它们全部映射到 DTO,我认为您最好的呼声是使用像 AutoMapper 这样的工具。
猜你喜欢
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多