J'utilise LINQ to SQL pour récupérer des données, en utilisant des conditions booléennes (colonnes BIT en SQL). Ma requête LINQ ressemble à ceci:LINQ to SQL génère des conditions négatives dans la clause WHERE
var query = from r in db.Requests
select r;
query = query.Where(r => r.Completed == someBooleanVal);
query = query.Where(r => r.Cancelled == someOtherBool);
return query.ToList();
Le « Où() » soit appliquée dans une autre méthode, c'est la raison pour laquelle je le mettre séparément.
Lorsque les valeurs booléennes sont données fausses, le SQL généré ressemble à quelque chose comme ceci:
SELECT [t0].[col1], [t0].[col2], [t0].[col3], [t0].[etc]
FROM [dbo].[Requests] AS [t0]
WHERE (NOT(([t0].[Cancelled]) = 1) AND (NOT(([t0].[Completed]) = 1)
au lieu de ce que j'utiliser:
WHERE [t0].[Cancelled] = 0 AND [t0].[Completed] = 0
Cela fonctionne très, très lentement. Je soupçonne fortement que c'est à cause des conditions négatives sur les valeurs booléennes qu'il a générées (toutes les colonnes sélectionnées sont couvertes par un index, et les deux colonnes de la clause where ont un index séparé dessus).
Pourquoi génère-t-il des conditions négatives? Comment puis-je le réparer?
Avez-vous essayé d'exécuter le code SQL «nettoyé» (c'est-à-dire non-négatif-conditions) pour voir comment cela fonctionne par rapport à la SQL générée Linq? –
Les champs de bits peuvent-ils être nullables? – leppie
Je l'ai essayé avec les conditions non négatives. Dans un test, j'ai fait: Avec des conditions non négatives, la requête prend moins d'une seconde. Avec la requête générée, cela prend plus de 3 secondes. – avesse