2010-08-26 59 views
1

請幫我寫LINQ這個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) 
) 

SOLUTION

這是我實現的解決方案,它給了我正是我需要的時候我交叉檢查它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() 
    } 

回答

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 } 
+0

我需要'svcOptions.SvcOptionName'有條件的值,那就是'CASE WHEN'子句中指定的條件。如果可能,我想知道更簡單/更好的方法。 – IsmailS 2010-08-27 04:49:26

+0

!我還沒有創建外鍵,所以我不知道是否讓'svc = svcMap.Svc'工作? – IsmailS 2010-08-27 05:07:12

+0

+1感謝您的靈感。我得到了解決方案。 – IsmailS 2010-08-27 08:28:01