Извлечение данных из 1 DataContext для использования в чужом методе - PullRequest
0 голосов
/ 16 января 2012

Я пытался преобразовать этот оператор 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

Я задал подобный вопрос здесь до того, как было сказано, что мне нужно будет создать представление, чтобы выполнить это.Это все еще правда или когда-либо?

Ответы [ 2 ]

1 голос
/ 16 января 2012

Я использую 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, как я описал выше. .

Надеюсь, это поможет вам и даст вам результаты, которые вы хотите, без необходимости создавать представления для каждого кросс-контекстного запроса, который вы хотите выполнить.

0 голосов
/ 16 января 2012

Мое понимание (я не гуру в linqtosql) было таким же, что это было невозможно без использования view / sproc.

Однако быстрый поиск обнаружил это в MSDNфорумы с обходным путем.Цитата из ответа Дэмиена:

2.Добавьте одну из таблиц в другой контекст данных (Скопируйте DBML поверх и добавьте к имени атрибута имя базы данных, например, database2.dbo.MyTable)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...