2012-10-30 2 views
1

J'observe un comportement étrange lors de l'interrogation de champ null d'une entité Entity Framework avec le connecteur Devart DotConnect for PostgreSQL.Comment interroger une entité Entity Framework pour une valeur de champ null avec DotConnect pour PostgreSQL

Par exemple: Si je fait les 2 tests suivants:

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

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

Lors de la vérification de requête SQL généré automatiquement EF-je obtenir les résultats suivants:

Résultat 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} 

Résultat pour test2:

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

Le résultat lors de l'interrogation pour le champ nul est très étrange ... Je me attendais à un résultat similaire à l'épreuve 2 résultat, mais avec une clause WHERE "Extent1".id_bloc IS NULL ...

Est-ce un bug? Comment puis-je effectuer une requête efficace pour un champ nul?

+0

Avez-vous essayé 'Where (x =>! X.id_bloc.HasValue)'? (Mais honnêtement, je m'attendrais à ce qu'il crée le même SQL.) – Slauma

+1

Je ne connais pas ce fournisseur de requêtes, mais at-il mappé le champ de base de données 'id_bloc' à un type nullable alors que dans la base de données ce n'est pas? Il peut décider de créer une requête bidon à bas prix lorsque les prédicats évaluent à «false» à coup sûr. Que se passe-t-il si vous tapez 'Where (x => true == false)' vous-même? –

+0

Vous avez raison, une requête fictive a été générée car j'essayais d'évaluer si une propriété non nullable était nulle ... Merci –

Répondre

1

La propriété id_bloc est-elle définie avec l'attribut Entity Key? Si oui, le résultat SQL est généré correctement. Entity Framework évite les requêtes inutiles à la table: génère un faux SQL qui donne le même ensemble de résultats vide mais ne mange pas les ressources du serveur.

Vous pouvez vérifier le comportement avec SQL Server (via System.Data.SqlClient) - il doit être identique.

+0

Mon problème était effectivement lié à une propriété non nullable dans mon modèle ... Tout fonctionne comme prévu lorsque le L'option nullable est correctement définie. Merci –

Questions connexes