代码之家  ›  专栏  ›  技术社区  ›  IsmailS

SQL查询到LINQ转换所需的帮助

  •  1
  • IsmailS  · 技术社区  · 14 年前

    请帮助我为这个SQL编写LINQ

    select svc.SvcName, svcOptions.SvcOptionName, svcMap.Price from svcMap
    inner join 
    svc
    on svcMap.SvcId = svc.SvcId
    inner join 
    svcOptions
     on svcOptions.SvcOptionId = CASE WHEN (svcMap.DesiredSvcOptionId <> 0 AND svcMap.DesiredSvcOptionId <> svc.DisabledSvcOptionId) THEN
                                                                            svcMap.DesiredSvcOptionId
                                                                    WHEN (svcMap.PresentSvcOptionId <> svc.DisabledSvcOptionId) THEN
                                                                        svcMap.PresentSvcOptionId
                                                                    ELSE
                                                                        0
                                                                    END
    where svcMap.ToBill = 1
    and
    (
      (svcMap.DesiredSvcOptionId = 0 AND svcMap.PresentSvcOptionId <> svc.DisabledSvcOptionId)
      OR 
      (svcMap.DesiredSvcOptionId <> 0 AND svcMap.DesiredSvcOptionId <> svc.DisabledSvcOptionId)
    )
    

    解决方案

    这是我实现的解决方案,当我与它进行交叉检查时,它正好提供了我所需要的东西。 LinqPad

    from svcMap in db.ServicesMap
      join svc in db.Services on svcMap.SvcId equals svc.SvcId
      join option in db.Options on
        ((svcMap.DesiredSvcOptionId != 0 && svcMap.DesiredSvcOptionId != svc.DisabledSvcOptionId)
           ? svcMap.DesiredSvcOptionId
           : (svcMap.PresentSvcOptionId != svc.DisabledSvcOptionId)
               ? svcMap.PresentSvcOptionId
               : 0)
        equals option.SvcOptionId
    where svcMap.ToBill == 1
          && (
               (svcMap.DesiredSvcOptionId == 0 &&
                svcMap.PresentSvcOptionId != svc.DisabledSvcOptionId)
               ||
               (svcMap.DesiredSvcOptionId != 0 &&
                svcMap.DesiredSvcOptionId != svc.DisabledSvcOptionId)
             )
    select
      new 
        {
          svc.SvcName,
          option.SvcOptionName,
          svcMap.Price.GetValueOrDefault()
        }
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Amy B    14 年前

    为什么在你的加入标准中有一个案例?您希望优化器能准确地处理这个问题吗?

    这是直译。

    from svcMap in db.svcMaps
    where svcMap.ToBill == 1
    let svc = svcMap.Svc
    where (svcMap.Desired == 0 && svcMap.Present <> svc.Disabled)
      || (svcMap.Desired <> 0 && svcMap.Desired <> svc.Disabled)
    let optionId =
      svcMap.Desired <> 0 && svcMap.Desired <> svc.Disabled ? svcMap.Desired :
      svcMap.Present <> svc.Disabled ? svc.Present :
      0
    from option in db.Options
    where option.SvcOptionId == optionId
    select new {svc.SvcName, option.SvcOptionName, svcMap.Price }