2010-09-08 3 views
1

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?

+0

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? –

+0

Les champs de bits peuvent-ils être nullables? – leppie

+0

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

Répondre

0
var query = 
    from r in db.Requests.Where(r => r.Completed == someBooleanVal && r.Cancelled == someOtherBool) 
    select r; 

    return query.ToList(); 

J'espère que cela peut vous aider et passer une bonne journée.

Questions connexes