【问题标题】:Joining on a many to many relationship with LINQ加入与 LINQ 的多对多关系
【发布时间】:2012-12-18 16:18:49
【问题描述】:

我的任务是将一些旧的 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,它是一个关系表,表示 DeliverySubscriptionDeliveryMethod 之间的多对多关系。

这显示为:

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

...但是,因为到目前为止我在应用程序中还有很多其他的东西要更改,所以我还无法构建以测试它,所以我只是想运行这个,请大家看看这是否正确.

【问题讨论】:

  • 尝试 sqltolinq 进行复杂查询。
  • 感谢您的建议,这是一个漂亮的小程序。不幸的是,它似乎无法转换此 SQL 语句。我不断收到“索引超出数组范围。”

标签: sql linq entity-framework ef-database-first


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多