2012-12-18 89 views
2

我的任务是将一些旧的SQL存储过程转换为LINQ,以进行EF迁移,我们正在做和Im有点难倒。鉴于这是从现有应用程序的迁移,edmx首先生成数据库。所以,我有我试图复制一个SQL语句:加入与LINQ的多对多关系

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中复制它。请帮忙!

UPDATE: 所以看各地的网络,我发现这表明做这样一个类似的例子:

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(",$","") 
       } 

...然而,因为我还有很多其他的事情在应用程序从而改变远远我无法建立为了测试这个,所以我只是想运行这个买你所有看看这是否正确。

+0

对于复杂查询,请尝试** [sqltolinq](http://www.sqltolinq.com/)**。 –

+0

谢谢你的建议,这是一个漂亮的小程序。不幸的是,它似乎无法转换此SQL语句。我不断收到“索引超出了数组的界限”。 – Brandon

回答

0

该查询是一个野兽。如果你没有任何性能问题,我可能只是将它添加到数据模型并使用linq/EF来调用它。