2016-08-09 51 views
0

Ich habe eine findAll Funktion, die alle Datensätze aus einer Contacts Tabelle in der Datenbank abruft und sie dann filtert, je nachdem, welche Werte der Benutzer in der Suchmaske ausgewählt hat. Die Ergebnisse werden jeweils zu einem Filter gefiltert.C# IQueryable funktioniert nicht

IQueryable<Contact> resultContacts = db.Contacts; 

if(request['Name'] != "") 
{ 
    resultContacts = resultContacts.Where(a => a.Name.Contains(Name)); 
} 

if(request['Phone'] != "") 
{ 
    resultContacts = resultContacts.Where(a => a.Phone.Equals(Phone)); 
} 

if(request['Company'] != "") 
{ 
    resultContacts = resultContacts.Where(a => a.Company.Contains(Company)); 
} 

return resultContacts; 

Das Problem ist, dass dies jetzt nicht funktioniert. Die resultContacts.Where innerhalb jedes if wird auf das ursprüngliche resultContacts zurückgesetzt, das ich aus irgendeinem Grund in der ersten Zeile hatte. Zum Beispiel: wenn ich debugge, gelten die Änderungen innerhalb der 1. wenn (ich am Ende mit 10 von 100 Datensätze), aber wenn ich in die 2. wenn gehe, fragt der Code das Original resultContacts, nicht die 10 hatte ich als a Ergebnis der ersten if.

Dies funktionierte gut für über ein Jahr bis vor 2 Wochen. Ich weiß nicht, ob sich etwas an meinem Code geändert hat ... wenn ich eine Referenz oder etwas hinzugefügt habe, das diese Änderung macht.

Irgendeine Idee warum? Vielen Dank!

+0

Wollten Sie das Anfrageobjekt in jeder Abfrage verwenden? Wie '.Contains (Anfrage ['Name']));' – Niklas

+1

Ich bin erstaunt C# erlaubt diese Syntax 'Anfrage ['Phone']' einzelnes Zitat Umarmung 'char' nicht' string' – Imad

+0

Auch, 'Anfrage ['Name' ] 'ist nicht dasselbe wie' Name'. Dito für 'Telefon' und' Firma'. Legen Sie keinen Code, der irgendwie aussieht wie das, was Sie haben. Post * echter * Code. – hvd

Antwort

-2
var results = db.Contacts 
    .Where(a => request["Company"] == String.Empty || a.Company.Contains(Company)) 
    .And(a => request["Phone"] == String.Empty || a.Phone.Equals(Phone)) 
    .And(a => request["Name"] == String.Empty || a.Name.Contains(Name))); 
+2

Sie könnten einfach alle 3 Bedingungen in das Where-Klausel-Recht vereinheitlichen? das scheint zu funktionieren, will nur sicher sein, dass ich es verstehe. – MichaelThePotato

+0

Ja, ich denke du könntest. – Matt

+1

Geben Sie Ihrer Antwort eine Erklärung, nicht nur einen Code. Ich verstehe den Unterschied im Verhalten zwischen OP-Code und diesem nicht. Für mich sollten sie genauso arbeiten ... – 3615