从1个DataContext中提取数据以在另一个中使用';s方法

本文关键字:方法 DataContext 1个 提取 数据 另一个 | 更新日期: 2023-09-27 18:20:31

我一直在尝试将此SQL语句转换为LINQ语句,但由于返回的部分信息与其他信息在分离数据库(Datacontext)中,因此遇到了问题。我非常确信这是可以克服的,但我似乎未能完成这一任务,也未能找到以前成功尝试的示例。

有人能为我克服这一障碍提供一些指导吗?感谢

SELECT p.PersonID, p.FirstName, p.MiddleName, p.LastName, cp.EnrollmentID, cp.EnrollmentDate, cp.DisenrollmentDate
FROM [Connect].dbo.tblPerson AS p
    INNER JOIN (
    SELECT c.ClientID, c.EnrollmentID, c.EnrollmentDate, c.DisenrollmentDate
    FROM [CMO].dbo.tblCMOEnrollment AS c
        LEFT OUTER JOIN [CMO].dbo.tblWorkerHistory AS wh
        ON c.EnrollmentID = wh.EnrollmentID
            INNER JOIN [CMO].dbo.tblStaffExtended AS se
            ON wh.Worker = se.StaffID
    WHERE (wh.EndDate IS NULL OR wh.EndDate >= getdate())
    AND wh.Worker = --WorkerGUID Param here
) AS cp
ON p.PersonID = cp.ClientID
ORDER BY p.PersonID

我之前在这里问过一个类似的问题,因为有人告诉我,我需要创建一个视图才能完成这一任务。这仍然是真的吗?

从1个DataContext中提取数据以在另一个中使用';s方法

我使用LINQPad对SQL执行了许多LINQ操作。它允许的功能之一是为一个查询使用多个数据上下文。

例如,下面是我在LINQPad 中编写的一些代码

from template in RateTemplates
where
   template.Policies.Any(p => 
      Staging_history.Changes.Any(c => 
         (c.Policies.Any(cp => cp.PolicyID == p.PolicyID) || 
         c.PolicyFees.Any(cpf => cpf.PolicyID == p.PolicyID) || 
         c.PolicyOptions.Any(cpo => cpo.PolicyID == p.PolicyID)) &&
         c.ChangeTime > new DateTime(2012, 1, 11)
      )
   )
select new
{
   TemplateID  = template.ID,
   UserID      = template.UserID,
   PropertyIDs = template.Properties.Select(ppty => ppty.PropertyID)
}

表"RateTemplate"是我的第一个数据上下文的一部分(使用LINQPad,你不必在代码中定义第一个数据语境,这只是假设,但如果你这样做是C#,你需要具体说明要使用哪个上下文等)。"Staging_history"是第二个数据上下文,我使用的是该上下文中的表"Changes"。

LINQ to SQL将在后台发挥各种魔力,最终执行的SQL是。。。

-- Region Parameters
DECLARE @p0 DateTime = '2012-01-11 00:00:00.000'
-- EndRegion
SELECT [t0].[ID] AS [TemplateID], [t0].[UserID], [t1].[PropertyID], (
    SELECT COUNT(*)
    FROM [Property] AS [t7]
    WHERE [t7].[RateTemplateID] = [t0].[ID]
    ) AS [value]
FROM [RateTemplate] AS [t0]
LEFT OUTER JOIN [Property] AS [t1] ON [t1].[RateTemplateID] = [t0].[ID]
WHERE EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [Policy] AS [t2]
    WHERE (EXISTS(
        SELECT NULL AS [EMPTY]
        FROM [staging_history].[dbo].[Change] AS [t3]
        WHERE ((EXISTS(
            SELECT NULL AS [EMPTY]
            FROM [staging_history].[dbo].[Policy] AS [t4]
            WHERE ([t4].[PolicyID] = [t2].[PolicyID]) AND ([t4].[ChangeID] = [t3].[ID])
            )) OR (EXISTS(
            SELECT NULL AS [EMPTY]
            FROM [staging_history].[dbo].[PolicyFee] AS [t5]
            WHERE ([t5].[PolicyID] = [t2].[PolicyID]) AND ([t5].[ChangeID] = [t3].[ID])
            )) OR (EXISTS(
            SELECT NULL AS [EMPTY]
            FROM [staging_history].[dbo].[PolicyOption] AS [t6]
            WHERE ([t6].[PolicyID] = [t2].[PolicyID]) AND ([t6].[ChangeID] = [t3].[ID])
            ))) AND ([t3].[ChangeTime] > @p0)
        )) AND ([t2].[RateTemplateID] = [t0].[ID])
    )
ORDER BY [t0].[ID], [t1].[PropertyID]

因此,看起来您只需要为每个要使用的数据库加载一个数据上下文,然后构建一个LINQ查询,在一个LINQ语句中使用这两个数据上下文。

希望这能帮助你,让你得到你想要的结果,而不必为你想要做的每个跨上下文查询创建视图

我的理解(我不是linqtosql的专家)是一样的,如果不使用视图/sproc,这是不可能的。

然而,快速搜索后,在MSDN论坛上找到了一个解决方法。引用Damien的回答:

2.将其中一个表添加到另一个数据上下文(将DBML复制到上面,并在名称属性前面加上数据库的名称,例如。database2.dbo.MyTable)