2017-03-21 4 views
0

Eine Tabelle kann entweder nach ID, Käufer oder Preis gefiltert werden. Und der Algorithmus sollte so sein:Filterung basierend auf der vorherigen Filterung

1. Filter Id, dann Filter Käufer auf der Grundlage der vorherigen Filter Ergebnis, so gilt Preis. 2. Filter Käufer, dann Filter Preis auf der Grundlage der vorherigen Filter Ergebnis, so tut Id. 3. Filter Preis, dann Filter-ID basierend auf dem vorherigen Filter-Ergebnis, so der Käufer.

List<Item> items = new List<Item>(); 
if(!string.IsNullOrEmpty(_txtboxId_) 
{ 
    items = dbContext.Items.Where(m => m.Id.Contains(_txtboxId_).ToList(); 
} 
else 
    items = dbContext.Items.ToList(); 

if(!string.IsNullOrEmpty(_txtboxBuyer_) 
{ 
    items = dbContext.Items.Where(m => m.Id.Contains(_txtboxBuyer_).ToList(); 

} 
else 
    items = dbContext.Items.ToList(); 

if(!string.IsNullOrEmpty(_txtboxPrice_) 
{ 
    items = dbContext.Items.Where(m => m.Id.Contains(_txtboxPrice_).ToList(); 

} 
else 
    items = dbContext.Items.ToList(); 

Wie bin ich nehme an, die Filterung auf einem anderen Ergebnis basiert tun und spielt keine Rolle, welche Bedingung (Id, Käufer oder Preis) kommt zuerst?

+3

Warum Sie Klammern haben brauchen für die 'if' Blöcke, aber nicht für die' else'? Sie sollten wirklich zu einer Konvention halten. – Guy

Antwort

3

Tun Sie nicht ToList() bis Sie mit Ihren Filtern fertig sind. Wenn alle Ihre Filter richtig eingestellt sind, führen Sie Ihre Abfrage in die Datenbank ein, indem Sie ToList() nur einmal aufrufen.

IQueriable<Items> items; 
if(!string.IsNullOrEmpty(_txtboxId_) 
{ 
    items = dbContext.Items.Where(m => m.Id.Contains(_txtboxId_); 
} 
else 
    items = dbContext.Items.ToList(); 

if(!string.IsNullOrEmpty(_txtboxBuyer_) 
{ 
    items = dbContext.Items.Where(m => m.Id.Contains(_txtboxBuyer_); 

} 
else 
    items = dbContext.Items.ToList(); 

if(!string.IsNullOrEmpty(_txtboxPrice_) 
{ 
    items = dbContext.Items.Where(m => m.Id.Contains(_txtboxPrice_); 

} 

items = dbContext.Items.ToList(); 
+2

Der Grund dafür ist, dass die Abfrage nicht generiert und solange gegen die Datenbank ausgeführt wird, bis sie enumeriert wird, was 'ToList()' tut. Das erste Mal, wenn 'ToList()' aufgerufen wird, wird das Dataset abgerufen, und Sie filtern das als eine Liste von Objekten und nicht als SQL-Abfrage. – Heki

+0

@Heki Dadurch bringen Sie eine Menge nutzloser Datensätze in den Speicher, was die Leistung Ihrer Anwendung beeinträchtigt. – Oscar

+1

Genau mein Punkt, obwohl nicht explizit geschrieben :) – Heki

1

Zuerst würde ich vorschlagen, dass Sie nicht die ToList() -Methode aufrufen, bis Sie die Sammlung von Daten getan erstellen Ihnen zeigen, oder verwenden möchten.

Ich bin nicht ganz sicher, dass dies Ihre Sammlung sortieren wird, wie Sie erwarten, sondern versuchen, in die Methode SortiertNach Linq Erweiterung aussehen: https://msdn.microsoft.com/en-us/library/bb534966(v=vs.110).aspx

3

Sie IQueryable verwenden sollten, und Sie ganze Abfrage erstellen, dann ist es nur an die Datenbank senden am Ende mit ToList(). Auch halten Sie auf jedem Filter die DbContext arbeiten, verwenden die gleichen Gegenstände Variable, wenn Sie die vorherigen Filter behalten wollen, auf diese Weise Sie nicht einmal den zweiten und dritten sonst Zweige

IQueryable<Item> items; 
if(!string.IsNullOrEmpty(_txtboxId_) 
{ 
    items = dbContext.Items.Where(m => m.Id.Contains(_txtboxId_); 
} 
else 
{ 
    items = dbContext.Items; 
} 

if(!string.IsNullOrEmpty(_txtboxBuyer_) 
{ 
    items = items.Where(m => m.Id.Contains(_txtboxBuyer_); 
} 

if(!string.IsNullOrEmpty(_txtboxPrice_) 
{ 
    items = items.Where(m => m.Id.Contains(_txtboxPrice_); 
} 

return items.ToList()