Je suis tombé sur un problème avec EF création terrible requêtes lors de la recherche sur un champ de type chaîne. Son produit une requête dans le style de programmeurs paresseux pour englober null contrôle des forces de la totalité de l'index pour être analysés.
examiner les requêtes suivantes.
-
Requête 1
var p1 = "x"; var r1 = ctx.Set<E>().FirstOrDefault( subject => p1.Equals(subject.StringField));
-
Requête 2
const string p2 = "x"; var r2 = ctx.Set<E>().FirstOrDefault( subject => p2.Equals(subject.StringField));
Requête 1 produit
WHERE (('x' = [Extent2].[StringField]) OR (('x' IS NULL) AND ([Extent2].[StringField] IS NULL)))
et s'exécute en 4 secondes
Requête 2 produit
WHERE (N'x' = [Extent2].[StringField])
et s'exécute en 2 millisecondes
Quelqu'un sait-il de solutions? (pas de paramètre ne peut pas être un const tel qu'il est saisi par l'utilisateur, mais ne peut pas être null.)
N. B Quand les profilés, les deux requêtes sont préparés avec sp_executesql par EF; comme de cause s'ils étaient juste exécuté la requête de l'optimiseur va à l'encontre du OU " x " EST NULL vérifier.