この問題に取り組むためのアドバイスを探しています。多くの左外部結合を持つこの大規模なSQLクエリがあります。ここでLINQで左外部結合を持つ大規模な複雑なクエリを再作成
はクエリです:
Select Top 1 WA.BHATUS_ID, WA.[CRMBHG_WORKINGACCOUNT_ID], BA.BHATUS_ID, BA.[CRMBHG_BILLINGACCOUNT_ID], BAD.BHATUS_ID, [BAD].[CRMBHG_BILLINGADDRESS_ID], SAD.BHATUS_ID, [SAD].[CRMBHG_SERVICEADDRESS_ID], C.BHATUS_ID, [C].[CRMBHG_CONTACT_ID]
From BillingHiBHory As BH With (NoLock)
Left Outer Join WorkingAccount As WA With (NoLock)
On WA.UniversalAccountId = BH.UniversalAccountId
And WA.BillingRegion = BH.BillingRegion
Left Outer Join BillingAccount As BA With (NoLock)
On BA.UniversalAccountId = BH.UniversalAccountId
And BA.BillingRegion = BH.BillingRegion
Left Outer Join BillingAddress As BAD With (NoLock)
On BAD.Grouping = BH.Grouping
And BAD.SubGrouping = BH.SubGrouping
And BAD.BillingRegion = BH.BillingRegion
Left Outer Join dbo.SubScriberInfo SUB With (NoLock)
On SUB.Grouping = BH.Grouping
And SUB.SubGrouping = BH.SubGrouping
And SUB.BillingRegion = BH.BillingRegion
Left Outer Join ServiceAddress As SAD With (NoLock)
On SAD.ControlNumberAssigned = SUB.ServceControlNum
And SAD.BillingRegion = SUB.BillingRegion
Left Outer Join Contact As C With (NoLock)
On BH.AccountNum = C.AccountNum
And BH.BillingRegion = C.BillingRegion
Where BH.Grouping = @Grouping
And BH.SubGrouping = @SubGrouping
Order By BH.SequenceOrder, WA.StatusDate Desc, BA.StatusDate Desc, BAD.StatusDate Desc, SAD.StatusDate Desc, C.StatusDate Desc
ここでLINQの構文で私の最初の亀裂があります...
var statusIds = (
from wa in db.WorkingAccount
from ba in db.BillingAccount
from bad in db.BillingAddress
from si in db.SubscriberInfo
from sad in db.ServiceAddress
from c in db.CRMSTG_CONTACT
where wa.UniversalAccountId == UniversalSubscriberId && wa.BillingRegion == BillingRegion
where ba.UniversalAccountId == UniversalSubscriberId && ba.BillingRegion == BillingRegion
where bad.Grouping == Grouping && bad.SubGrouping == SubGrouping && bad.BillingRegion == BillingRegion
where si.Grouping == Grouping && si.SubGrouping == SubGrouping && si.BillingRegion == BillingRegion
where sad.ControlNumberAssigned == si.ServceControlNum && sad.BillingRegion == BillingRegion
where c.AccountNum == AccountNumber && c.BillingRegion == BillingRegion
orderby wa.StatusDate descending, ba.StatusDate descending, bad.StatusDate descending, sad.StatusDate descending, c.StatusDate descending
select new
{
workingAddressStatusId = wa.StatusId,
billingAccountStatusId = ba.StatusId,
billingAddressStatusId = bad.StatusId,
serviceAddressStatusId = sad.StatusId,
contactStatusId = c.StatusDate
}
).FirstOrDefault();
この大部分は動作しますが、大きなハックのように感じています。これが落ちるのは、StatusId値の1つがnullに戻り、statusIdsがnullになった場合です。
私はこれを行うためのよりよい方法があると確信しています。私は提案に開放されています。
はい、私はTSQLの「With(NoLock)」オプションに関連するリスクを認識しています。私たちは非常にビジー状態のデータベースのセカンダリアプリであり、ブロックを作成したくありません請求およびサポートスタッフが作業を行うためチェーンが必要です。私たちがやっていることに対して、NoLockは問題ではありません。アグリゲータを使用して複数のユニオン・クエリを実行しているようなわけではありません。 ;)
やあ、良い一日、可能であれば、あなたはそれぞれのドメイン構造を含めることができます。
StatusId
タイプがint
ある場合たとえば、あなたはこのようなものを使用する必要がありますか? – gabああ、データ型が矛盾していて、AS400データベースからMSSQLデータベースにステージングされてから、MSSQLデータベースに移動して移動する前に、私がリンクしているキーの本質を書きましょう。 – amber
私の意見では、これがレガシーデータベースの一部をリファクタリングする場合、このクエリをストアドプロシージャに保存し、この特定のsqlを生成するためにlinqを処理しようとするのではなく、EFがspを呼び出すようにします。私は、複数の左結合を解決するために、データモデルをそれほど多く必要としないように調整します。 – jkerak