2016-05-23 15 views
0

Ich versuche AutoMapper zu verwenden, um meine paged (https://www.nuget.org/packages/X.PagedList) Sammlung von Entitäten zu meinem ViewModel zuzuordnen. Dies ist wahrscheinlich einfacher, mit Code erklärt:AutoMapper, Entity Framework und Counts

Das Modell:

public class Article { 
    public int Id { get; set; } 
    public string Title { get; set; } 
    // ... 
    public virtual ICollection<User> Subscribers { get; set; } 
} 

Ansicht Modell:

public class ArticleViewModel { 

    public class ArticleListEntry { 
     public int Id { get; set; } 
     public string Title { get; set; } 
     // ... 
     public int SubscribersCount { get; set; } 
    } 

    // ... 
    public IPagedList<ArticleListEntry> ArticleList { get; set; } 
} 

Mapping Config:

CreateMap<Article, ArticleViewModel.ArticleListEntry>(); 

Controller:

public ActionResult Index(int? page) { 
    int pageSize = 25; 
    int pageNumber = (page ?? 1); 

    var model = new ArticleViewModel(); 

    IQueryable<Article> articles = db.Articles.OrderBy(a => a.Title); 

    model.Articles = Mapper.Map<IPagedList<Article>, IPagedList<ArticleViewMode.ArticleListEntry>>(articles).ToPagedList(pageNumber, pageSize); 

    return View(model); 
} 

Nun, das funktioniert. Aber, wie einige schnell darauf hinweisen, führt dies einen neuen Datenbankaufruf für jeden Eintrag in der Liste durch, wenn versucht wird, die Anzahl der Abonnenten zu erhalten - so dauert es eine gute Sekunde oder zwei, wenn Sie eine große Seitengröße haben (und das ist klar falsch sowieso). Ich kann in .Include(a => a.Subscribers) hinzufügen, wenn ich die Artikel ergreife, aber das zieht viele unnötige Daten ein (nicht wahr?), Wenn alles, was ich will, die Zählung ist. Gibt es etwas Offensichtliches, das mir hier fehlt?

Wenn AutoMapper hier ist völlig dumm, bitte sagen Sie mir aus und beraten Sie mich, was wäre mehr gesund.

+0

Ich denke, das Problem in Ihrem ToPagedList() -Methode liegen könnte. Könnten Sie den Code dafür veröffentlichen? – Spivonious

+0

Ich würde die Abfrage mit ToList() auf Artikeln auslösen, bevor Sie das Ergebnis an AutoMapper übergeben. – Oscar

+1

Sie können sich ['ProjectTo'] (https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions) ansehen. –

Antwort

1

Heh, das funktioniert und kommt mit einer wirklich netten SQL-Anweisung auch heraus!

model.Articles = db.Articles.OrderBy(a => a.Title).ProjectTo<ArticleViewMode.ArticleListEntry>().ToPagedList(pageNumber, pageSize); 

Feste nur, nachdem Sie commentsd aber trotzdem danke Charles Mager :)