2016-06-21 18 views
0

Ich arbeite an einer Anwendung, wo ein Benutzer Datensätze nach Kategorien filtern kann.So verbessern Sie die LINQ-Abfrage

Ein Datensatz muss 1 haben, kann aber viele Kategorien haben. (1- *)

Die Frage, die ich habe, ist, was kann ich tun, um diese Suche zu verbessern? Es läuft zur Zeit auf etwa ein O (n^3) aus dem folgenden Grund:

Eine Transaktion kann viele Datensätze (1-many) Ein Datensatz viele Kategorien (1-many) Iterieren durch die ausgewählten Kategorien haben kann für die Suche

die Grundzüge dessen, was ich tue, ist die folgende:

retrieve all announcements 

if(startDate and endDate have values) 
    model = model.Where(x => x.WADate >= start.Value && x.WADate <= end.Value).ToList(); 

if(queryString is not null) 
    model = model.Where(
         x => x.WANum.Contains(query) || 
         x.Tooltip.ToLower(CultureInfo.InvariantCulture).Contains(query) 
         || x.Topic.ToLower(CultureInfo.InvariantCulture).Contains(query) 
        ).ToList(); 

if (selectedCategories.Count > 0) 
     { 
      bool HasMatch; 
      foreach (var ancmt in announcements) 
      { 
       HasMatch = false; 
       foreach (var cat in selectedCategories) 
       { 
        foreach (var xref in ancmt.waXref) 
        { 
         if (cat.ID == xref.WACategoryID) 
         { 
          HasMatch = true; 
         } 
        } 
       } 
       if(HasMatch) 
       { 
        model.Add(new EditViewModel 
        { 
         WATypeID = ancmt.WATypeID, 
         WANum = ancmt.WANum, 
         WATypeName = ancmt.waType.WATypeDescription, 
         Link = ancmt.Link, 
         Tooltip = ancmt.Tooltip, 
         Topic = ancmt.Topic, 
         WADate = ancmt.WADate, 
         WAID = ancmt.WAID, 
        }); 

        ancmt.waXref.ToList().ForEach(
         x => model.Last().Categories.Add(
          new CategoryViewModel { ID = x.WACategoryID, Name = x.waCategory.WACategory, IsSelected = false })); 
       } 
      } 
     } 
     // If no catgories were selected, keep all announcements for next stage of search 
     else 
     { 
      foreach (var ancmt in announcements) 
      { 
       model.Add(new EditViewModel 
       { 
        WATypeID = ancmt.WATypeID, 
        WANum = ancmt.WANum, 
        WATypeName = ancmt.waType.WATypeDescription, 
        Link = ancmt.Link, 
        Tooltip = ancmt.Tooltip, 
        Topic = ancmt.Topic, 
        WADate = ancmt.WADate, 
        WAID = ancmt.WAID, 
       }); 

       ancmt.waXref.ToList().ForEach(
        x => model.Last().Categories.Add(
         new CategoryViewModel { ID = x.WACategoryID, Name = x.waCategory.WACategory, IsSelected = false })); 
      } 
     } 

I Methode Syntax verwende, nicht zu bleiben in der Methode Syntax abfragen und bevorzugen.

+6

Das sieht für mich nicht wie eine Linq-Abfrage aus. –

+0

Es ist schwer zu sagen, nur aus dem Code, was das erwartete Ergebnis der "Abfrage" sein sollte. Es sieht so aus, als würdest du nur einen Übereinstimmungsmerker für jeden Datensatz setzen. Führen Sie stattdessen eine tatsächliche Linq-Abfrage aus. –

+0

Realer Code hinzugefügt @RobertHarvey – Ingenioushax

Antwort

1

Für echte Leistungssteigerungen wäre es am besten, spezifische Stored Procedures zu erstellen, um die eigentliche Heavy Lifting-Verarbeitung in der Datenbank und nicht auf dem Client-PC zu verarbeiten.

+0

Diese Route wurde verwendet und einige gespeicherte Prozeduren erstellt, um die Daten in einer abgespeckten Ergebnismenge zurückzugeben. – Ingenioushax

Verwandte Themen