2010-11-14 10 views
1

Je fais un projet pour mes études. Lors de la construction du moteur de recherche pour mon application, je l'ai fini avec le code comme ceci:Requête LINQ-To-Entities avec les clauses .Where ne filtrant pas comme prévu

public List<Document> FindDocument(string docName, Company company, 
            Department departament, Worker worker, 
            DateTime? enterDate, DateTime? expDate, 
            State state) 
{ 
    IQueryable<Document> query = context.Documents 
       .Include(p => p.Department) 
       .Include(p => p.Company) 
       .Include(p => p.State) 
       .Include(p => p.Workers); 
    if (docName != null) 
     query.Where(p => p.DocumentName.Contains(docName)); 
    if (company != null) 
     query.Where(p => p.Company.Equals(company)); 
    if (departament != null) 
     query.Where(p => p.Department.Equals(departament)); 
    if (worker != null) 
     query.Where(p => p.Workers.Contains(worker)); 
    if (enterDate.HasValue) 
     query.Where(p => p.EnterDate.Equals(enterDate.Value)); 
    if (expDate.HasValue) 
     query.Where(p => p.ExpDate.Equals(expDate.Value)); 
    if (state != null) 
     query.Where(p => p.State.Equals(state)); 

    return query.ToList();    
} 

Les critères de recherche sont facultatifs, donc je dois vérifier si l'un des critères sont nuls. L'application est faite de sorte que si ce critère n'est pas utilisé alors sa valeur est nulle.

Le problème avec cette requête est qu'elle renvoie toujours tous les documents, et pas seulement les documents satisfaisant aux critères. J'ai vérifié avec le débogueur à l'exécution pour s'assurer que si une valeur est spécifiée alors le corps d'instruction if est évalué.

Répondre

3

Vous devez modifier les déclarations:

query.Where(...) 

à

query = query.Where(...) 

Sinon, vous êtes ne change rien, appelle simplement une fonction sans prendre le résultat

+0

Je suis stupide: P J'ai besoin de dormir! Big THX – Pax0r

3

Votre problème est que vous avez supposé que Enumerable.Where modifie la requête existante. Il ne le fait pas - il renvoie une nouvelle requête. Vous devez affecter le résultat de l'appel à Where retour à la variable query:

query = query.Where(p => ...); 
1

vous avez besoin de modifier légèrement votre code. LINQ ne modifie pas la collection, mais renvoie une nouvelle valeur avec le résultat.

query = query.Where(...)