【问题标题】:Running a query on two DBcontext在两个 DBcontext 上运行查询
【发布时间】:2013-10-28 17:12:40
【问题描述】:

我正在尝试针对两个上下文运行查询,但每次都会收到此错误:

无法创建类型的常量值 'CC_Metrics_Apps.RefQutReturns'。只有原始类型('例如 Int32, 在此上下文中支持 String 和 Guid')。

我正在尝试这样查询:

Public Function IDQ() As List(Of RefQutReturns)
  Dim val As List(Of RefQutReturns) = (From x In GlobalVar.db.RET.RefQutReturns
                                       Select x).ToList
  Return val
End Function

Public Function QueTypeDD() As IEnumerable(Of SelectListItem)
  Dim val As New List(Of SelectListItem)
  Dim valQ = From v In GlobalVar.db.PS.TaskQueueTypes
             Join x In IDQ() On v.QutID Equals x.QutID.ToString
             Select v
  val.Add(New SelectListItem With {.Text = "Select Item", .Value = 0})
  For Each v In valQ
    val.Add(New SelectListItem() With {.Text = v.QutDesc, .Value = v.QutID})
  Next
  Return val
End Function

【问题讨论】:

  • 由于.ToList()IDQ() 方法中,您试图将已经在客户端实现的结果与来自服务器端GlobalVar.db.PS.TaskQueueTypes 的结果结合起来。 EF 不支持将本地非原始类型与在数据库中评估的 (SQL) 查询混合。
  • @Pawel 所以我需要在运行 Join 查询之前将两个查询都放入内存?
  • 在您的情况下,您从一个上下文中获得了具体化的返回,您尝试将其用作数据库查询的参数(因此您将 Linq 与对象和 Linq 与实体混合),这是不受支持的。您有 2 个上下文 - 假设(在大多数情况下有效)是不同的上下文意味着不同的数据库,因此 EF 将无法创建可以连接结果的单个查询。问题是为什么你有 2 个上下文 - 如果它们都在同一个数据库上工作 - 它们可以合并吗?如果没有 - 您需要将结果带给客户。
  • @Pawel 您能否将您的评论转换为答案,以便我给您打勾。通过将两个查询放入内存然后按照您的建议加入它们来解决该问题。但是 .tolist 仍然是必需的。

标签: vb.net asp.net-mvc-3 linq linq-to-sql dbcontext


【解决方案1】:

EF 不支持跨越多个上下文的查询。在大多数情况下,可能无法在一个数据库中创建和运行这样的查询,因为它必须访问不同的数据库(跟踪实体也可能会出现问题)。如果您有两个上下文但在一个数据库上工作,您可能希望合并上下文。否则,您需要将两种上下文的结果都提供给客户端,并使用 Linq To Objects 查询将它们组合起来。 另请注意,在您的情况下,您将 Linq To Object 查询(因为 IDQ() 中的 .ToList())与 Linq To Entities 混合 - 这也不支持,因为 EF 不知道如何将物化的非原始结果带到将执行查询的数据库。

【讨论】:

    猜你喜欢
    • 2017-10-31
    • 2016-08-30
    • 1970-01-01
    • 2023-03-31
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多