从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
我之前在这里问过一个类似的问题,因为有人告诉我,我需要创建一个视图才能完成这一任务。这仍然是真的吗?
我使用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)