我的任务是将一些旧的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]
。没有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(",$","")
}
...然而,因为我还有很多其他的事情在应用程序从而改变远远我无法建立为了测试这个,所以我只是想运行这个买你所有看看这是否正确。
对于复杂查询,请尝试** [sqltolinq](http://www.sqltolinq.com/)**。 –
谢谢你的建议,这是一个漂亮的小程序。不幸的是,它似乎无法转换此SQL语句。我不断收到“索引超出了数组的界限”。 – Brandon