Frage

ich dieses einfache Daten Problem ratlos bin.

Ich verwende das Framework Entity und haben eine Datenbank von Produkten. Meine Ergebnisse Seite gibt eine paginierte Liste dieser Produkte. Gerade jetzt meine Ergebnisse werden durch die Anzahl der Verkäufe jedes Produkt bestellt haben, so meinen Code sieht wie folgt aus:

return Products.OrderByDescending(u => u.Sales.Count());

Das gibt ein IQueryable-Datensatz meiner Entitäten, durch die Anzahl der Verkäufe sortiert.

Ich möchte, dass meine Ergebnisse Seite den Rang eines jeden Produkts zeigen (im Datensatz). Meine Ergebnisse sollen wie folgt aussehen:

Page #1
1. Bananas
2. Apples
3. Coffee

Page #2
4. Cookies
5. Ice Cream
6. Lettuce

Ich erwarte, dass ich möchte nur eine Spalte in meine Ergebnisse fügen Sie die SQL ROW_NUMBER Variable ... aber ich weiß nicht, wie diese Spalte meine Ergebnisse Datentabelle hinzuzufügen.

Meine resultierende Seite hat eine foreach-Schleife enthalten, aber da ich einen paginierte Satz mit Mir vermute, diese Zahl zu fälschen eine Rangnummer verwendet würde der beste Ansatz nicht sein.

Also meine Frage ist, wie kann ich eine ROW_NUMBER Spalte auf meine Abfrageergebnisse in diesem Fall?

Keine korrekte Lösung

Andere Tipps

Mit der indiziert Überlastung von Select :

var start = page * rowsPerPage;
Products.OrderByDescending(u => u.Sales.Count())
    .Skip(start)
    .Take(rowsPerPage)
    .AsEnumerable()
    .Select((u, index) => new { Product = u, Index = index + start });

Eigentlich SortiertNach und anschließend Weiter + Nehmen erzeugt ROW_NUMBER in EF 4,5 (Sie mit SQL Profiler überprüfen).

Ich habe nach einem Weg die gleiche Sache, die Sie fragen zu tun, und ich war in der Lage zu bekommen, was ich durch eine Vereinfachung von Craig Antwort müssen:

var start = page * rowsPerPage;
Products.OrderByDescending(u => u.Sales.Count())
    .Skip(start)
    .Take(rowsPerPage)
    .ToList();

Durch die Art und Weise, die erzeugte SQL verwendet ROW_NUMBER> starten und TOP rowsPerPage.

Hier ist eine lange umständliche Antwort. Zuerst eine Klasse erstellen, das Anzahl / Stück Paar Hause wie folgt:

public class NumberedItem<T>
{
    public readonly int Number;
    public readonly T Item;

    public NumberedItem(int number, T item)
    {
        Item = item;
        Number = number;
    }
}

Als nächstes kommt eine Abstraktion um eine Seite der Elemente (nummerierte oder nicht):

class PageOf<T> : IEnumerable<T>
{
    private readonly int startsAt;
    private IEnumerable<T> items;

    public PageOf(int startsAt, IEnumerable<T> items)
    {
        this.startsAt = startsAt;
        this.items = items;
    }

    public IEnumerable<NumberedItem<T>> NumberedItems
    {
        get
        {
            int index = 0;
            foreach (var item in items)
                yield return new NumberedItem<T>(startsAt + index++, item);
            yield break;
        }
    }

    public IEnumerator<T> GetEnumerator()
    {
        foreach (var item in items)
            yield return item;
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

Sobald Sie, dass Sie „Paginate“ eine bestimmte abfragbaren Sammlung mit diesem:

class PaginatedQueryable<T>
{
    private readonly int PageSize;
    private readonly IQueryable<T> Source;

    public PaginatedQueryable(int PageSize, IQueryable<T> Source)
    {
        this.PageSize = PageSize;
        this.Source = Source;
    }

    public PageOf<T> Page(int pageNum)
    {
        var start = (pageNum - 1) * PageSize;
        return new PageOf<T>(start + 1, Source.Skip(start).Take(PageSize));
    }
}

Und schließlich eine schöne Erweiterung Methode zur Deckung der ugly:

static class PaginationExtension
{
    public static PaginatedQueryable<T> InPagesOf<T>(this IQueryable<T> target, int PageSize)
    {
        return new PaginatedQueryable<T>(PageSize, target);
    }
}

Was bedeutet, können Sie dies jetzt tun:

var products = Products.OrderByDescending(u => u.Sales.Count()).InPagesOf(20).Page(1);

foreach (var product in products.NumberedItems)
{
    Console.WriteLine("{0} {1}", product.Number, product.Item);
}

Versuchen Sie, diese

var x = Products.OrderByDecending(u => u.Sales.Count());
var y = x.ToList();

for(int i = 0; i < y.Count; i++) {
    int myNumber = i; // this is your order number
}

Solange die Liste in der gleichen Reihenfolge bleibt, was es sei denn, die Verkaufsnummer ändert passieren sollte. Sie könnten der Lage sein, eine genaue Zählung zu erhalten;

Es gibt auch diese Art und Weise tun.

var page = 2;
var count = 10;
var startIndex = page * count;

var x = Products.OrderByDecending(u => u.Sales.Count());
var y = x.Skip(startIndex).Take(count);

Dies gibt den Startindex für die Seite, und es gibt Ihnen einen kleinen Satz von Verkäufen auf der Seite angezeigt werden soll. Sie starten einfach das Zählen auf Ihrer Website unter start.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top