Я использую 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, как я описал выше. .
Надеюсь, это поможет вам и даст вам результаты, которые вы хотите, без необходимости создавать представления для каждого кросс-контекстного запроса, который вы хотите выполнить.