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

时间:2012-01-16 16:17:31

标签: c# linq linq-to-sql

我一直在尝试将这个SQL语句转换为LINQ,并且我遇到的问题是返回的部分信息来自其余部分的Seperate数据库(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

我之前已经问过similar question here因为被告知我需要创建一个View才能完成此任务。这是真的还是永远?

2 个答案:

答案 0 :(得分:1)

我使用LINQPad做了很多LINQ to SQL。它允许的一个功能是为一个查询使用多个数据上下文。

例如,这是我在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)
}

表“RateTemplates”是我的第一个数据上下文的一部分(使用LINQPad,您不必在代码中定义第一个数据上下文,但是如果您这样做是C#,则需要具体说明使用哪种上下文等)。 “Staging_history”是第二个数据上下文,我正在使用此表中的“更改”表。

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语句中使用这两个数据上下文,就像我上面的那样

希望这可以帮助您获得您想要的结果,而无需为您想要执行的每个跨上下文查询创建视图。

答案 1 :(得分:0)

我的理解(我不是linqtosql的大师)是相同的,没有使用视图/ sproc是不可能的。

但是,快速搜索,找到this on MSDN forums并找到解决方法。引自Damien在那里的回答:

  

2.将其中一个表添加到其他数据上下文(复制DBML并将name属性作为数据库名称的前缀,例如   database2.dbo.MyTable)