2016-08-19 90 views
1

我有一個SQL查詢,我試圖轉換爲實體框架表達式。其中一個連接子句對null進行了測試,我不確定如何在EF中表示它。這裏是SQL查詢,發現實際參加有多個條件:實體框架加入空條件

SELECT T1.* 
FROM product T1 
INNER JOIN T2 ON T1.pk1 = T2.fk1 
INNER JOIN T3 ON T2.pk2 = T3.fk2 AND T3.x IS NULL  <-- this is the issue 

出於對一些簡單的盲目的希望,我想這EF表達:

from t1 in ctx.T1 
join t2 in ctx.T2 on t1.pk1 equals t2.fk1 
join t3 in ctx.T3 on t2.pk2 equals t3.fk2 && t3.x == null 
select t1 

編譯器不喜歡&& t3.x == null部分。它說

錯誤CS0019操作員「& &」不能應用於類型「詮釋」和「布爾」的操作數

所以,我想這(注意T3.x是一個可空日期字段):

from t1 in ctx.T1 
join t2 in ctx.T2 on t1.pk1 equals t2.fk1 
join t3 in ctx.T3 on new { A = t2.pk2, B = null as DateTime? } equals new { A = t3.fk2 && B = t3.x } 
select t1 

其編譯,但是當我運行它,我得到

無法創建類型爲「System.Object」的空常量值。在此上下文中僅支持實體類型,枚舉類型或基本類型。

那麼我該如何去做呢?

更新:正如Ivan Stoev指出的那樣,問題是我使用null as DateTime?而不是(DateTime?)null。因此,工作查詢看起來是這樣的:

from t1 in ctx.T1 
join t2 in ctx.T2 on t1.pk1 equals t2.fk1 
join t3 in ctx.T3 on new { A = t2.pk2, B = (DateTime?)null } equals new { A = t3.fk2 && B = t3.x } 
select t1 

回答

4

上移的條件where條款(內部聯接真的無所謂):

join t3 in ctx.T3 on t2.pk2 equals t3.fk2 
where t3.x == null 

,或者使用下面的

join t3 in ctx.T3 
    on new { A = t2.pk2, B = (DateTime?)null } 
    equals new { A = t3.fk2, B = t3.x } 
+0

謝謝,看起來我不得不使用新的{A = t2.pk2,B =(DateTime?)null}'而不是新的{A = t2.pk2,B = null作爲DateTime? }' – d512