【问题标题】:Entity Framework left Join two databasesEntity Framework left 加入两个数据库
【发布时间】:2013-08-01 22:29:27
【问题描述】:

我需要使用实体框架将列表加入数据库查询。 基本上,我有两个数据库,我需要将一个数据库中的表外部连接到另一个数据库中的表。 为了做到这一点,我想从第一个数据库中获取一个列表,然后将它加入到第二个查询的查询中。 问题是,我必须将结果作为 IQueryable 返回,因此该方法的使用者可以在查询执行之前对查询进行额外的过滤。

我尝试了两种不同的方法:

选项 1:

 Public Shared Function List() As IQueryable(Of ContractEquipment)
' Get Subcontractors from Database 1
Dim subcontractors As List(Of SubContractor) = GetSubContractorList().ToList()
' Query Database 2
Return (From c In DB.ContractEquipments
        Select New With {
            .ContractID = c.ContractID,
            .EquipmentID = c.EquipmentID,
            .Inactive = c.Inactive,
            .SubContractorName = (From x In subcontractors Where c.SubContractorID = x.SubContractorID Select x.Name).FirstOrDefault()
        }) 

结束函数

选项 2:

Public Shared Function List() As IQueryable(Of ContractEquipment)
' Get Subcontractors from Database 1
Dim subcontractors As List(Of SubContractor) = GetSubContractorList().ToList()
' Query Database 2
Return (From c In DB.ContractEquipments
        Group Join s in subcontractors on c.SubContractorID equals s.SubContractorID into tblSubContractors = Group
        Select New With {
            .ContractID = c.ContractID,
            .EquipmentID = c.EquipmentID,
            .Inactive = c.Inactive,
            .SubContractorName = tblSubContractors.Select(Function(z) z.Name).FirstOrDefault()
        })

结束函数

我不断收到同样的错误: “无法创建 type 的常量值。此上下文仅支持原始类型('例如 Int32、String 和 Guid')。”

有人有什么建议吗?

【问题讨论】:

    标签: vb.net entity-framework


    【解决方案1】:

    好的,我找到了解决方法。 在数据库 2 中创建了一个视图:

    CREATE VIEW dbo.ViewContractEquipment
    AS SELECT e.ContractEquipmentID, s.Name as SubContractorName
    FROM dbo.ContractEquipments AS e 
    LEFT OUTER JOIN DB2.dbo.SubContractors AS s ON e.SubContractorID = s.SubContractorID
    

    然后我将视图添加到我的查询中并将其与主表连接:

        Return (From d In DB.ViewContractEquipments
            Join c in DB.ContractEquipments ON c.ContractEquipmentID equals d.ContractEquipmentID
            Select New With {
                .ContractID = c.ContractID,
                .EquipmentID = c.EquipmentID,
                .Inactive = c.Inactive,
                .SubContractorName = d.SubContractorName
            })
    

    不优雅,但它有效!

    【讨论】:

      猜你喜欢
      • 2017-08-04
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多