2012-10-30 67 views
1

當使用Devart DotConnect for PostgreSQL連接器查詢實體框架實體時,我觀察到一個奇怪的行爲。如何使用DotConnect for PostgreSQL查詢實體框架實體的空字段值

例如:如果我提出的2個以下測試:

 
var test1 = context.blocs.Where(x => x.id_bloc == null); 

var test2 = context.blocs.Where(x => x.id_bloc == 100); 

當EF自動生成的SQL查詢我得到如下結果檢查:

結果爲TEST1:

 
{SELECT 
CAST(NULL AS int) AS "C1", 
CAST(NULL AS varchar) AS "C2", 
CAST(NULL AS varchar) AS "C3", 
CAST(NULL AS varchar) AS "C4" 
FROM (SELECT 1 AS X) AS "SingleRowTable1" 
WHERE true = false} 

測試2的結果:

 
{SELECT 
"Extent1".id_bloc, 
"Extent1".numero, 
"Extent1".nom, 
"Extent1".titre 
FROM "role".bloc AS "Extent1" 
WHERE "Extent1".id_bloc = 100} 

結果查詢空場時,很奇怪......我期待類似於測試2的結果,但與"Extent1".id_bloc IS NULL WHERE子句...

它是一個錯誤的結果?我怎樣纔能有效地查詢空字段?

+0

您是否嘗試過'Where(x =>!x.id_bloc.HasValue)'? (但老實說,我希望它會創建相同的SQL。) – Slauma

+1

我不知道這個查詢提供程序,但它是否將數據庫字段'id_bloc'映射到可空類型,而在數據庫中它不是?當謂詞肯定評估爲「假」時,它可能決定創建一個便宜的虛假查詢。如果你自己輸入'Where(x => true == false)'會發生什麼? –

+0

你說得對,生成了一個虛擬查詢,因爲我試圖評估一個不可爲空的屬性是否爲空......謝謝 –

回答

1

是否使用實體鍵屬性定義了id_bloc屬性?如果是,則結果SQL被正確生成。

實體鍵不能爲空,這就是爲什麼實體框架避免對錶的不必要請求:生成假的SQL,它給出相同的空結果集,但不吃服務器資源。

你可以用SQL Server檢查行爲(通過System.Data.SqlClient) - 它必須是相同的。

+0

我的問題實際上與我的模型中的一個不可空屬性有關......一切工作如預期可空選項設置正確。謝謝 –