2010-11-12 57 views
0

我想要做一个可以加入一个可能的空值的连接。Linq2Sql,加入可能的空字段

from data in Data 
join d1 in Data on new { a = data.pId, b = language } equals new { a = d1.pId, b = d1.language } into j1 
from dta1 in j1.DefaultIfEmpty() 
join d2 in Data on new { a = data.pId, b = fallback} equals new { a = d2.pId, b = d2.language } into j2 
from dta2 in j1.DefaultIfEmpty() 
where ((int?)dta1.id ?? dta2.id) == data.Id 
select data; 

这里的问题是,PID可以为空,如果是,连接不匹配,因为它比较

data.pId = null 

,而不是

data.pId is null 

在正常where子句我可以做object.Equals(data.pId,d1.pId),它会做一个空检查,但我怎么能在连接中做到这一点?

+0

这个查询试图完成什么? – diceguyd30 2010-11-12 15:19:05

+0

在这种特定情况下,它正在对数据表上的语言进行回退,因此可能有多种语言的数据,并且应该按照某种顺序回退。这是隔离问题的简化版本。 – Runeborg 2010-11-12 15:24:10

回答

0

一种方法是将空值转换为其他未使用但尚可比较的值。

join d1 in Data 
    on new { a = data.pId ?? -33, b = language } 
    equals new { a = d1.pId ?? -33, b = d1.language } 
    into j1 
+0

这可能会起作用,但我不知道它会如何影响查询计划,因为我刚刚意识到如何糟糕的合并可能会搞砸查询计划。 – Runeborg 2010-11-18 11:19:11

+0

一个有效的问题,但这种担心适用于执行此操作的任何技术(加入值OR null)。 – 2010-11-18 13:36:11