2016-08-11 3 views
-1

Ich arbeite gerade an einer Suche nach einer Website und ich stecke mit einem Problem fest, das nicht einmal so schwer zu lösen scheint. Ich bin einfach nicht in der Lage, die Lösung selbst herauszufinden.Suche mit mehreren Bedingungen?

Situation: Im aktuellen Stand meiner Suche ich die Ereignisse Daten sortieren kann (ich kann Oktober zum Beispiel wählen, und es wird nur die Ereignisse zeigen, die im Oktober geschehen), für die Kategorien (Die Ereignisse jeweils haben Kategorien) und sogar Text suchen. Wenn ich Oktober als Monat und Festival als Kategorie auswähle, bekomme ich alle Ereignisse im Oktober und alle Festivals. Ich will nur die Feste, die im Oktober stattfinden. Irgendwelche Ideen, wie ich das erreichen könnte?

Dies ist, was ich bisher habe:

var validEvents = new List<Item>(); 
var allEvents = ((LinkField)this.controlItem.Fields["Event Container"]).TargetItem.Children.ToList(); // getting the events 

if (this.ddlMonths.SelectedIndex != 0 || this.ddlCategories.SelectedIndex != 0 || this.searchQuery.Text != string.Empty) 
{ 
    foreach (var currentEvent in allEvents) 
    { 
     var isValid = false; 

     // 1. Check for months 
     if (this.ddlMonths.SelectedIndex != 0) 
     { 
      // .. validation if event should be displayed 

      if (startDate <= monthDates[1].Date && endDate >= monthDates[0].Date) 
      { 
       isValid = true; 
      } 
     } 

     // 2. Check for categories 
     if (this.ddlCategories.SelectedIndex != 0) 
     { 
      foreach (var eventCategory in ((MultilistField) currentEvent.Fields["Categories"]).GetItems()) 
      { 
       if (eventCategory["Category"].ToLower() == this.ddlCategories.SelectedValue.ToLower()) 
       { 
        isValid = true; 
       } 
      } 
     } 

     // 3. Check for search query 
     if (this.searchQuery.Text != string.Empty) 
     { 
      var searchText = this.searchQuery.Text; 

      if (currentEvent["Title"].Contains(searchText) || currentEvent["Text"].Contains(searchText)) 
      { 
       isValid = true; 
      } 
     } 

     if (isValid) 
     { 
      validEvents.Add(currentEvent); 
     } 
    } 
} 
+0

Sie folgenden Code folgt, sollten Sie 3 Liste für die drei Filter machen Sie haben, dann füge die 3 in die endgültige Liste ein, die nur die gleichen Elemente in den 3 Listen enthält. Dies ist nicht sehr optimal, aber es ist eine einfache Lösung. – Raskayu

+0

Was hat Ihre Frage mit dem Sortieren zu tun? Ich sehe den Punkt dieses Tags nicht. Was die Frage betrifft, die du gestellt hast, IMHO, du machst alles falsch. Erstens, wenn Sie die ganze Suche als eine einzelne Schleife schreiben möchten, können Sie das tun, aber Ihre Schleife ist zu kompliziert. Befreien Sie sich von 'isValid' und setzen Sie' continue' bei jeder Bedingung fort, die _exclude_ ein Element enthält. Jedes Element, das bis zum Ende der Schleife überlebt, kann enthalten sein. Aber wirklich, diese Art von Ding ist, wofür LINQ ist. Sie sollten etwas über die eingebauten C# /. NET-Funktionen herausfinden, um genau diese Art von Dingen zu unterstützen. –

+0

Alles klar @PeterDuniho, ich werde einen Blick darauf werfen – Awusuwah

Antwort

0

LINQ Verwenden Sie Suchbedingungen kombinieren können als

var allEvents = ...; 

IEnumerable<Item> events = allEvents; 

if (ddlMonths.SelectedIndex != 0) 
    events = events.Where(condition1); 

if (ddlCategories.SelectedIndex != 0) 
    events = events.Where(condition2); 

if (searchQuery.Text != string.Empty) 
    events = events.Where(condition3); 

var validEvents = events.ToList(); 
0

I

var isValid = true; 

in Zeile 8, dann setzen würde, wenn eine der Bedingungen nicht erfüllt ist, es zu false gesetzt. Überspringen Sie auch jede weitere Prüfung, wenn isValid bereits false ist.

Hoffe es hilft!

EDIT - Complete Code:

var validEvents = new List<Item>(); 
var allEvents = ((LinkField)this.controlItem.Fields["Event Container"]).TargetItem.Children.ToList(); // getting the events 

if (this.ddlMonths.SelectedIndex != 0 || this.ddlCategories.SelectedIndex != 0 || this.searchQuery.Text != string.Empty) 
{ 
    foreach (var currentEvent in allEvents) 
    { 
     var isValid = true; 

     // 1. Check for months 
     if (this.ddlMonths.SelectedIndex != 0) 
     { 
      // .. validation if event should be displayed 

      if (!(isValid && startDate <= monthDates[1].Date && endDate >= monthDates[0].Date)) 
      { 
       isValid = false; 
      } 
     } 

     // 2. Check for categories 
     if (this.ddlCategories.SelectedIndex != 0) 
     { 
      foreach (var eventCategory in ((MultilistField) currentEvent.Fields["Categories"]).GetItems()) 
      { 
       if (!(isValid && eventCategory["Category"].ToLower() == this.ddlCategories.SelectedValue.ToLower())) 
       { 
        isValid = false; 
       } 
      } 
     } 

     // 3. Check for search query 
     if (this.searchQuery.Text != string.Empty) 
     { 
      var searchText = this.searchQuery.Text; 

      if (!(isValid && currentEvent["Title"].Contains(searchText) || currentEvent["Text"].Contains(searchText))) 
      { 
       isValid = true; 
      } 
     } 

     if (isValid) 
     { 
      validEvents.Add(currentEvent); 
     } 
    } 
} 
+0

Leider funktioniert das nicht für mich. Erhalten Sie immer noch Ereignisse, die nicht meiner Kategorie entsprechen. Aber ich habe eine Idee, wie ich es lösen könnte! Ich werde @Raskayus Lösung versuchen. Trotzdem danke :) – Awusuwah