对Linq Conversion的SQL查询需要帮助

时间:2010-08-26 11:40:23

标签: linq linq-to-sql

请帮我写一下这个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 个答案:

答案 0 :(得分:2)

为什么在加入条件中有CASE?您期望优化器完全按照这个做什么?

这是一个字面翻译。

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 }