2012-08-28 3 views
0

J'essaie de sélectionner toutes les lignes où la colonne 'Value' est nulle ou un espace. Il est de type nvarchar et est autorisé à être nul.La requête s'exécute comme 1 est égal à 1 au lieu de null check

Lorsqu'elle est exécutée, la requête suivante ne produit pas le bon SQL.

current.Where(
      a => 
      a.Data.All(ad => ad.AccountTag.Id != currentTag.Item1) 
      || a.Data.Any(ad => ad.AccountTag.Id == currentTag.Item1 && string.IsNullOrWhiteSpace(currentTag.Item2))) 

La fonction string.IsNullOrWhiteSpace convertit en 1 /* @p3 */ = 1

J'ai essayé d'utiliser la fonction ci-dessus et en utilisant également currentTag.Item2 == null || currentTag.Item2.Equals(string.Empty) à la fois avec les mêmes résultats.

SQL complet ci-dessous

select data2_.Id from [isnapshot.Client].[dbo].AccountData data2_ 
    where account0_.Id = data2_.ClientAccountId 
    and data2_.AccountTagId = 1 /* @p2 */ 
    and 1 /* @p3 */ = 1) 

Répondre

2

La requête est correcte. currentTag est une variable locale qui n'a rien à voir avec la requête. Par conséquent l'expression string.IsNullOrWhiteSpace(currentTag.Item2) sera évaluée avant il est même converti en SQL et le résultat est soit true (1) ou false (0), qui sera la valeur de p3.

+0

C'est seulement quand quelqu'un d'autre regarde votre code que vous réalisez à quel point vous êtes un idiot. 'currentTag.Item2' aurait dû être' ad.Value' Je ne l'aurais jamais remarqué si vous ne l'aviez pas signalé. Merci – JConstantine

+0

@JLevett: Parfois, vous êtes juste aveugle pour les choses les plus évidentes. Cela arrive à tout le monde de temps en temps :-) –

Questions connexes