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.
Was die Werte in 'fields' sind, wenn Sie nur einen Filterwert auswählen (dh ist es '[7, 0]')? –
Ja. 7, 0. field_1 = 7, field_2 = 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' –