2016-07-15 19 views
0

Ich habe eine Seite, die einige Inhalte auflisten. Ich habe einen Paging für die Seite mit dem folgenden Code erstellt. Aber wie Sie sehen, musste ich eine zweite Abfrage erstellen, um RowCount zu erhalten. Kann ich Paging ohne eine zweite Abfrage an die Datenbank durchführen?Paging mit einzelner Abfrage in Asp.net Web Forms und Entity Framework

// ContentList.aspx.cs 
MySiteEntities db = new MySiteEntities(); 

my_ContentList = db.Content.Where(it => it.Language == "En" && it.Type == QueryType && it.Active == true && it.Deleted == false).OrderBy(it => it.Sort).Skip(PageSize * (PageIndex - 1)).Take(PageSize).ToList(); 

RowCount = db.Content.Where(it => it.Language == "En" && it.Type == QueryType && it.Active == true && it.Deleted == false).Count(); 

PageCount = RowCount/PageSize + 1; 




// ContentList.aspx 

<%if (RowCount > PageSize) {%> 

    <%if (PageIndex > 1) {%><a href="Content/<%=Type%>/<%=PageIndex-1%>" class="page-numbers prev">Previous</a><%}%> 

    <% 
    int Position = 1; 
    do 
    { 
    %> 
     <a href="Content/<%=Type%>/<%=Position%>" class="page-numbers <%if (Position == PageIndex) {%>current<%}%>"><%=Position%></a> 
    <% 
    Position++; 
    } while (Position < PageCount+1); 
    %> 

    <%if (PageIndex != PageCount) {%><a href="Content/<%=Type%>/<%=PageIndex+1%>" class="page-numbers next">Next</a><%}%> 

<%}%> 

Antwort

0

Lösung 1: Verwendung von EntityFramework.Extended Bibliothek wie Abfrage folgende, ist dies eine bessere Leistung aus der Lösung 2!

var query = db.Content.Where(it => it.Language == "En" && it.Type == QueryType && it.Active == true && it.Deleted == false); 

var countQuery= query.FutureCount(); 

var itemsQuery= query.OrderBy(it => it.Sort) 
    .Skip(PageSize * (PageIndex - 1)) 
    .Take(PageSize) 
    .Future(); 

int RowCount = countQuery.Value; 
var my_ContentList = itemsQuery.ToList(); 

Lösung 2: Die folgende Abfrage wird die Zählung und Seite Ergebnisse in einer Reise in die Datenbank bekommen, aber wenn Sie die SQL in SQLProfiler überprüfen, werden Sie sehen, dass es nicht sehr schön ist.

var query = db.Content.Where(it => it.Language == "En" && it.Type == QueryType && it.Active == true && it.Deleted == false); 

var pageResult = query.OrderBy(it => it.Sort) 
    .Skip(PageSize * (PageIndex - 1)) 
    .Take(PageSize) 
    .GroupBy (p => new { Total = query.Count() }) 
    .First(); 

int RowCount = pageResult .Key.Total; 
var my_ContentList = pageResult .Select(p => p); 

Kontrolle dieses link1 und link2