2016-04-18 9 views
1

Ich habe 4 Klassen:Suche Filtern nach Felder und Werte

public class Advertise { 
    public int AdvertiseId {get;set;} 
    public string Title {get;set;} 
    Description 
} 

public class Fields { 
    public int FieldId {get;set;} 
    public string Name {get;set;} 
} 

public class Values { 
    public int ValueId {get;set;} 
    public string ValueName {get;set;} 
} 

public class FieldsValues { 
    public int FieldValueId {get;set;} 
    public int AdvertiseId {get;set;} 
    public int FieldId {get;set;} 
    public int ValueId {get;set;} 
} 

Wenn Benutzer die Suche und senden Sie das Formular filtern, erhalte ich die Request.QueryString [ „Feld _“ + fieldID] und ich ein foreach tun, wie folgt:

var ads = from s in adsViewModel select s; 

var fields = Db.Fields.GetAll(); 

foreach (var field in fields) 
{ 
    int fieldValue; 
    var requestField = Int32.TryParse(Request.QueryString["field_" + field.FieldId], out fieldValue); 

    ads = ads.Where(s => s.FieldsValues.Any(x => x.ValueId == fieldValue)); 
} 

Gut, es funktioniert!

Das Ergebnis der Suche gibt jedoch nur ein ADS zurück, wenn die Felder genaue Kriterien haben. Zum Beispiel:

Anzeigen haben 2 Felder:

Zimmer = 7 (ValueID)

Parkplätze = 3 (ValueID)

Die Suche funktioniert nur, wenn der Benutzer ausgewähltes Zimmer = 7 und Parkplätze = 3

Wenn der Benutzer in Filter nur Räume = 7 auswählt, sind die Werte in der Anfrage field_1=7, field_2=0 und die Suche gibt null zurück.

+0

Was die Werte in 'fields' sind, wenn Sie nur einen Filterwert auswählen (dh ist es '[7, 0]')? –

+0

Ja. 7, 0. field_1 = 7, field_2 = 0. –

+0

Dann könnten Sie innerhalb der 'foreach' auf Null testen, und wenn dies der Fall ist, überspringen Sie die Ausführung der Abfrage. (zB 'if (fieldValue == 0) {continue;}') Derzeit, wenn seine Null, 'ads = ads.Where (s => s.FieldsValues.Any (x => x.ValueId == 0)); 'würde keine Ergebnisse zurückgeben, vorausgesetzt, Sie haben keine Werte mit' ValueId == 0' –

Antwort

3

Wenn einer der Werte in der Anfrage gleich Null ist, dann würde Ihre Anfrage gleichzusetzen

ads = ads.Where(s => s.FieldsValues.Any(x => x.ValueId == 0)); 

was bedeutet ads eine leere Auflistung würde vorausgesetzt, es gibt keine Zeilen in der Tabelle mit ValueId == 0.

Sie verwenden, um eine if Anweisung zu prüfen, ob einer der Werte Null sind, und wenn ja, überspringen Sie die Abfrage

foreach (var field in fields) 
{ 
    int fieldValue; 
    var requestField = Int32.TryParse(Request.QueryString["field_" + field.FieldId], out fieldValue); 
    if (fieldValue == 0) 
    { 
     continue; 
    } 
    ads = ads.Where(s => s.FieldsValues.Any(x => x.ValueId == fieldValue)); 
}