2017-12-27 4 views
0

Ich habe eine Get -Methode, die Arbeitsauslagerung hat, aber ich möchte auch eine Methode erstellen, die mehrere Entitäten desselben Basistyps zurückgeben kann und immer noch Paging haben.Kann ich Multifil-EF-Entitäten in einem IQueryable verwenden, um Paging zu implementieren?

Ich weiß, dass dies irgendwie in SQL übersetzt werden muss, was ich als mehrere Ergebnismengen zurückgeben müsste.

// Model classes 
public class Food 
{ 
    string Name {get;set;} 
} 

public class Fruit : Food 
{ 
    bool IsSweet {get;set;} 
} 

public class Vegetable : Food 
{ 
    bool IsGross {get;set;} 
} 

// FruitRepo -- BLL layer 
public List<Fruit> GetFruit(int userId, int page, int itemsPerPage) 
{ 
    var query = repo.Get<Fruit>(e => e.userId == userId); 
    var dbResults = query.Skip((itemsPerPage * page) - itemsPerPage).Take(itemsPerPage).ToList(); 
    return dbResults; 
} 

// FoodRepo -- BLL layer 
public List<Food> GetFood(int userId, int page, int itemsPerPage) 
{ 
    // How can I use IQuerable here to implement paging correctly? 

    List<Food> rv = new List<Food>(); 

    var repo = new Repo(); 
    rv.AddRange(repo.Get<Fruit>(e => e.userId == userId).ToList()); 
    rv.AddRange(repo.Get<Vegetable>(e => e.userId == userId).ToList()); 

    return rv; 
} 

Antwort

1

Es hängt wirklich davon ab, wie Sie die Entitäten in EF modelliert haben. EF kann different strategies with inheritance

folgen Wenn die geerbten Klassen simmilar sind in der Regel I Tabelle pro Hierachie wählen. Die ausgewählte Strategie kann sich auf die SQL-Leistung auswirken, Sie können jedoch die Geschäftslogik der ausgewählten Strategie abstrahieren.

Sie müssen nur EF anrufen, sobald die Liste füllen und EF reintegriert die Daten in die entsprechenden geerbten Klasse:

repo.Get<Food>(e => e.userId == userId).ToList()); 
+0

Ich glaube, das ist, was ich suche. Ich habe immer die Tabelle pro Entity gemacht, aber das sieht sehr vielversprechend aus. Der einzige mögliche Nachteil, den ich sehe, ist die Kombination vieler Tabellen/Entitäten, die für eine wirklich große Tabelle, irgendwelche anderen Dinge oder Einschränkungen sorgen können, um Code oder DB-Seite zu beachten? – user3953989

+0

Tabelle-pro-Typ vs. Tabelle-pro-Hierarchie sollte keinen * Effekt * auf die Seitenauslieferung haben. Sie sollten in der Lage sein, mit beiden Vererbungsmustern zu blättern. –

+0

@BradleyUffner Ich meinte irgendwelche Effekte im Allgemeinen, nicht spezifisch für Paging. – user3953989

1

Statt eine List<T> von Ihrem BLL zurückzukehren, kehren ein PagedList<T>, die unter anderem Dinge, kann eine Seitenanzahl sind:

Public class PagedList<T> { 
    public List<T> Results { get; set; } 
    public int PageNumber { get; set; } 
    public int TotalCount { get; set; } 
} 

dann Ihre GetFruit/GetFood Methoden wie folgt aussehen:

public List<Fruit> GetFruit(int userId, int page, int itemsPerPage) 
{ 
    var query = repo.Get<Fruit>(e => e.userId == userId); 
    var dbResults = query.Skip((itemsPerPage * page) - itemsPerPage).Take(itemsPerPage).ToList(); 
    return new PagedList<Fruit>() 
    { 
     Results = dbResults, 
     PageNumber = page, 
     TotalCount = query.Count(), 
    } 
} 
+1

Das habe ich eigentlich schon in meinem Code. Ich habe das Beispiel vereinfacht, um mich auf ein anderes Problem zu konzentrieren. Ich muss irgendwie "Fruit" und "Vegetable" kombinieren und korrekt von EF gepaged werden. Ich glaube, die Vererbung Antwort @minneto veröffentlicht ist mehr in die richtige Richtung. – user3953989

+0

@ user3953989 Es ist unklar von Ihrem Beitrag, ob 'Food' eine Basis * Entity * oder nur Basisklasse ist. –

+0

@IvanStoev Ich glaube nicht, dass ich den Unterschied kenne. Derzeit ist es nur eine Basisklasse (nur im Code vorhanden). – user3953989

Verwandte Themen