سؤال

أنا لاذع بمشكلة البيانات السهلة هذه.

أنا أستخدم إطار الكيان ولدي قاعدة بيانات للمنتجات. تقوم صفحة نتائجي بإرجاع قائمة مفهومة بهذه المنتجات. الآن يتم إصدار نتائجي من خلال عدد مبيعات كل منتج، لذلك يبدو رمزي مثل هذا:

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

يرجع هذا مجموعة بيانات IQueryable من كياناتي، مرتبة حسب عدد المبيعات.

أريد صفحة نتائجي لإظهار رتبة كل منتج (في DataSet). يجب أن تبدو نتائجي مثل هذا:

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

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

أتوقع أن أريد فقط إضافة عمود في نتائجي باستخدام متغير SQL ROW_NUMPER ... لكنني لا أعرف كيفية إضافة هذا العمود إلى نتائج بياناتي.

تحتوي صفحتي النتيجة على حلقة foreach، ولكن نظرا لأنني أستخدم مجموعة مفهومة، فأنا أظن أن استخدام هذا الرقم لتزوير رقم الترتيب لن يكون أفضل طريقة.

لذلك سؤالي هو، كيف يمكنني إضافة عمود Row_Number إلى نتائج استعلامي في هذه الحالة؟

لا يوجد حل صحيح

نصائح أخرى

استخدم ال التحميل الزائد المفهرس:

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

في الواقع باستخدام Orderby ثم تخطي + قم بإنشاء ROW_NUMBER في EF 4.5 (يمكنك التحقق من SQL Profiler).

كنت أبحث عن طريقة للقيام بنفس الشيء الذي تطلبه، وكنت قادرا على الحصول على ما أحتاج إليه من خلال تبسيط إجابة كريج:

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

بالمناسبة، يستخدم SQL SQL الذي تم إنشاؤه ROW_NUMBER> START and Top RowsperPage.

هنا هو إجابة طويلة الرياح. أولا إنشاء فئة لإيواء رقم / زوج العنصر مثل ذلك:

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

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

التالي يأتي التجريد حول صفحة من العناصر (مرقمة أم لا):

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();
    }
}

بمجرد أن يكون لديك "تخزين" مجموعة استنساخ معين باستخدام هذا:

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));
    }
}

وأخيرا طريقة تمديد لطيفة لتغطية القبيح:

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

مما يعني أنه يمكنك الآن القيام بذلك:

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);
}

جرب هذا

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
}

طالما أن القائمة تبقى بنفس الترتيب، والتي يجب أن يحدث ما لم يتغير رقم المبيعات. يمكنك أن تكون قادرا على الحصول على عدد دقيق؛

هناك أيضا طريقة للقيام بذلك.

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);

يمنح هذا مؤشر البداية للصفحة، بالإضافة إلى أنه يمنحك مجموعة صغيرة من المبيعات لعرضها على الصفحة. يمكنك فقط بدء العد على موقع الويب الخاص بك في StartIndex.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top