Присоединение к отношениям «многие ко многим» с помощью LINQ

Мне было поручено преобразовать некоторые старые хранимые процедуры 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(",$","")
                }

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


person Brandon    schedule 18.12.2012    source источник
comment
попробуйте sqltolinq для сложных запросов.   -  person Kundan Singh Chouhan    schedule 18.12.2012
comment
Спасибо за предложение, это отличная маленькая программа. К сожалению, похоже, невозможно преобразовать этот оператор SQL. Я продолжаю получать индекс за пределами массива.   -  person Brandon    schedule 18.12.2012


Ответы (1)


Этот запрос — зверь. Если бы у вас не было проблем с производительностью, я бы, вероятно, просто добавил его в модель данных и использовал linq/EF для его вызова.

person Rick james    schedule 27.12.2013