Мне было поручено преобразовать некоторые старые хранимые процедуры SQL в LINQ для миграции EF, которую мы делаем, и я немного озадачен. Учитывая, что это миграция из существующего приложения, база данных edmx была сгенерирована первой. Итак, у меня есть оператор SQL, который я пытаюсь воспроизвести:
SELECT DISTINCT
d.DeliverySubscriptionId
, d.ContactId
, d.statementMacroId_fk
, m.Name as MacroName
, DeliveryMethod = REPLACE((SELECT DISTINCT
dm2.Name + ',' AS 'data()'
FROM
DeliverySubscription d2
JOIN
StatementMacro m2 on
d2.StatementMacroId_fk = m2.StatementMacroId
JOIN
DeliverySubscription_Method_Rel dmr2 ON
d2.DeliverySubscriptionId = dmr2.DeliverySubscriptionId_Fk
JOIN
dbo.DeliveryMethod dm2 ON
dmr2.DeliveryMethodId_Fk = dm2.DeliveryMethodId
WHERE
d.DeliveryConfigurationId_fk = @configurationId
AND
d.IsActive = 1
AND
D.DeliverySubscriptionId = D2.DeliverySubscriptionId FOR XML PATH('')) + '$', ',$', '')
FROM
DeliverySubscription d
INNER JOIN
StatementMacro m ON
d.StatementMacroId_fk = m.StatementMacroId
JOIN
DeliverySubscription_Method_Rel dmr ON
d.DeliverySubscriptionId = dmr.DeliverySubscriptionId_Fk
JOIN dbo.DeliveryMethod dm ON
dmr.DeliveryMethodId_Fk = dm.DeliveryMethodId
WHERE
d.DeliveryConfigurationId_fk = @configurationId
AND
d.IsActive = 1
В частности, у меня возникла проблема с JOIN DeliverySubscription_Method_Rel
, которая представляет собой таблицу отношений, представляющую отношения «многие ко многим» между DeliverySubscription
и DeliveryMethod
.
Это проявляется как:
[DeliverySubscription] * ---- * [Delivery Method]
на диаграмме базы данных в файле edmx. Объект DeliverySubscription_Method_Rel
не создается. Как вы можете видеть в операторе SQL, JOIN находится непосредственно в таблице отношений, но я не могу понять, как воспроизвести это в LINQ. Пожалуйста помоги!
ОБНОВЛЕНИЕ: просматривая Интернет, я нашел аналогичный пример, который предлагал сделать что-то вроде этого:
from s in Context.DeliverySubscriptions
from dm in s.DeliveryMethods
join sm in Context.StatementMacroes on s.StatementMacroId_Fk equals sm.StatementMacroId
where s.DeliveryConfigurationId_Fk == configurationId
select new DeliverySubscription_dto
{
DeliverySubscriptionId = s.DeliverySubscriptionId,
QubeContactId = s.QubeContactId,
statementMacroId_fk = s.StatementMacroId_Fk,
MacroName = sm.Name,
DeliveryMethod = dm.Name.Replace("$","").Replace(",$","")
}
... однако, поскольку у меня все еще есть много других вещей, которые нужно изменить в приложении, я пока не могу собрать, чтобы протестировать это, поэтому я просто хотел запустить это, купить вас всех, чтобы увидеть, кажется ли это правильным.