2012-01-16 5 views
0

このSQL文をLINQに変換しようとしましたが、返される情報の一部が残りの部分から別のデータベース(Datacontext)にあることに問題があります。 。私はこれが克服できるとはかなり確信していますが、私はこれを達成することに失敗したり、以前の成功した試みの例を見つけることに失敗しているようです。1つの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を求めています。それはまだ本当ですか、それともこれでしたか?

答えて

0

私はlinqtosqlについては理解していませんが、view/sprocを使用しないとできませんでした。

ただし、クイック検索では、回避方法のあるthis on MSDN forumsが見つかりました。そこにダミアンの回答からの引用:

2.Add他のデータコンテキストへのテーブルのいずれか(例えば、 database2.dbo.MyTableを超えるDBMLをコピーし、データベースの名前を持つname属性の接頭辞)

1

LINQPadを使用して、多くのLINQ to SQLを実行します。 1つのクエリに対して複数のデータコンテキストを使用することができます。例えば

ここで私は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"は2番目のデータコンテキストであり、このテーブルから "Changes"テーブルを使用しています。

SQLにLINQが背景とされ実行されます結果の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] 

あなただけのそれぞれに一つのデータコンテキストをロードする必要がありますようだから、見えますデータベースを作成し、上記のように1つのlinq文で両方のデータコンテキストを使用するLINQクエリを作成します。

これにより、実行するクロスコンテキストクエリごとにビューを作成しなくても、必要な結果が得られます。

+0

面白い、ありがとう。私はこれをさらに調べます。 –

関連する問題