2011-04-18 62 views
2

我需要将sql查询转换为Linq to SQL查询,并且我无法得到我期望的结果: 我有2个表格,Base,M表格Linq to Sql IsNull用现有的FK替换NULL FK

BaseOne 
    { 
    MID (FK) , points to M 
    MChildID(FK, Nullable), points to M 
    } 

    M { 
    ID(PK) 
    } 

的简化选择:

SELECT * from BaseOne as f 
LEFT JOIN M as m ON ISNULL(f.MChildID, f.MID) = m.ID 

我尝试这样做:

from f in BaseOne 
from m in M.Where(function(x) If(f.MChildID.HasValue,x.ID.Equals(f.MChildID.Value),x.ID.Equals(f.MID.Value))).DefaultIfEmpty 

它产生吨他的SQL:

... 
     (CASE 
      WHEN [t0].[MID] IS NOT NULL THEN 
       (CASE 
        WHEN [t1].[ID] = ([t0].[MID]) THEN 1 
        WHEN NOT ([t1].[ID] = ([t0].[MID])) THEN 0 
        ELSE NULL 
       END) 
      ELSE 
       (CASE 
        WHEN [t1].[ID] = ([t0].[MChildID]) THEN 1 
        WHEN NOT ([t1].[ID] = ([t0].[MChildID])) THEN 0 
        ELSE NULL 
       END) 
     END)) = 1 
    LEFT OUTER JOIN ... 

我跟着these instructions但这个例子是不是exaclty我尝试做。
有什么建议吗?

回答

2

你有没有试过VB的二进制if() operator

from baseOne in BaseOne _ 
join m in M on if(baseOne.MChildID,baseOne.MID) equals m.ID _ 
select baseOne,m 

它产生一个COALESCE,其类似于ISNULL。

FROM [BaseOne] AS [t0] 
INNER JOIN [M] AS [t1] ON (COALESCE([t0].[MChildID],[t0].[MID])) = [t1].[ID]