سؤال

لدي اثنين من الجداول ، movies و categories, وأنا الحصول على قائمة مرتبة من قبل معرف_الفئة أولا ثم من قبل اسم.

فيلم جدول من ثلاثة أعمدة ، معرف واسم معرف_الفئة.فئة الجدول اثنين من الأعمدة ، معرف الاسم.

حاولت ما يشبه التالية ، لكنها لم تنجح.

var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })
هل كانت مفيدة؟

المحلول

هذا يجب أن تعمل من أجلك:

var movies = _db.Movies.OrderBy(c => c.Category).ThenBy(n => n.Name)

نصائح أخرى

استخدام غير امدا, استعلام جملة LINQ, يمكنك القيام بذلك:

var movies = from row in _db.Movies 
             orderby row.Category, row.Name
             select row;

[تحرير عنوان التعليق] للتحكم في ترتيب استخدام الكلمات الرئيسية ascending (وهو الافتراضي وبالتالي غير مفيدة) أو descending, مثل:

var movies = from row in _db.Movies 
             orderby row.Category descending, row.Name
             select row;

إضافة "الجديد":

var movies = _db.Movies.OrderBy( m => new { m.CategoryID, m.Name })

الذي يعمل على بلدي مربع.فإنه لا يعود شيء التي يمكن استخدامها لفرز.تقوم بإرجاع كائن مع اثنين من القيم.

مشابهة ولكن مختلفة لفرز من خلال جمع عمود على النحو التالي.

var movies = _db.Movies.OrderBy( m => (m.CategoryID.ToString() + m.Name))

استخدم السطر التالي على DataContext تسجيل SQL النشاط على DataContext إلى وحدة التحكم - ثم يمكنك ان ترى بالضبط ما ينق البيانات التي تطلب من قاعدة البيانات:

_db.Log = Console.Out

التالية LINQ البيانات:

var movies = from row in _db.Movies 
             orderby row.CategoryID, row.Name
             select row;

و

var movies = _db.Movies.OrderBy(m => m.CategoryID).ThenBy(m => m.Name);

تنتج SQL التالية:

SELECT [t0].ID, [t0].[Name], [t0].CategoryID
FROM [dbo].[Movies] as [t0]
ORDER BY [t0].CategoryID, [t0].[Name]

وحيث تكرر OrderBy في Linq يظهر عكس الناتجة SQL الإخراج:

var movies = from row in _db.Movies 
             orderby row.CategoryID
             orderby row.Name
             select row;

و

var movies = _db.Movies.OrderBy(m => m.CategoryID).OrderBy(m => m.Name);

تنتج SQL التالية (اسم معرف_الفئة يتم تبديل):

SELECT [t0].ID, [t0].[Name], [t0].CategoryID
FROM [dbo].[Movies] as [t0]
ORDER BY [t0].[Name], [t0].CategoryID

أنا خلقت بعض طرق الإرشاد (أدناه) لذلك لم يكن لديك ما يدعو للقلق إذا كان IQueryable هو أمر بالفعل أو لا.إذا كنت تريد أن تأمر من خلال خصائص متعددة فقط تفعل ذلك على النحو التالي:

// We do not have to care if the queryable is already sorted or not. 
// The order of the Smart* calls defines the order priority
queryable.SmartOrderBy(i => i.Property1).SmartOrderByDescending(i => i.Property2);

هذا هو مفيد خاصة إذا قمت بإنشاء طلب حيوي, f.هـ.من قائمة خصائص النوع.

public static class IQueryableExtension
{
    public static bool IsOrdered<T>(this IQueryable<T> queryable) {
        if(queryable == null) {
            throw new ArgumentNullException("queryable");
        }

        return queryable.Expression.Type == typeof(IOrderedQueryable<T>);
    }

    public static IQueryable<T> SmartOrderBy<T, TKey>(this IQueryable<T> queryable, Expression<Func<T, TKey>> keySelector) {
        if(queryable.IsOrdered()) {
            var orderedQuery = queryable as IOrderedQueryable<T>;
            return orderedQuery.ThenBy(keySelector);
        } else {
            return queryable.OrderBy(keySelector);
        }
    }

    public static IQueryable<T> SmartOrderByDescending<T, TKey>(this IQueryable<T> queryable, Expression<Func<T, TKey>> keySelector) {
        if(queryable.IsOrdered()) {
            var orderedQuery = queryable as IOrderedQueryable<T>;
            return orderedQuery.ThenByDescending(keySelector);
        } else {
            return queryable.OrderByDescending(keySelector);
        }
    }
}

هناك على الأقل أكثر من طريقة للقيام بذلك باستخدام LINQ ، وإن لم يكن أسهل.يمكنك أن تفعل ذلك باستخدام OrberBy() الأسلوب الذي يستخدم IComparer.تحتاج أولا إلى تنفيذ IComparer عن Movie فئة مثل هذا:

public class MovieComparer : IComparer<Movie>
{
    public int Compare(Movie x, Movie y)
    {
        if (x.CategoryId == y.CategoryId)
        {
            return x.Name.CompareTo(y.Name);
        }
        else
        {
            return x.CategoryId.CompareTo(y.CategoryId);
        }
    }
}

ثم يمكنك ترتيب الأفلام مع بناء الجملة التالي:

var movies = _db.Movies.OrderBy(item => item, new MovieComparer());

إذا كنت بحاجة إلى تبديل يأمر تنازلي عن واحد من العناصر فقط التبديل x و y داخل Compare() طريقة MovieComparer وفقا لذلك.

إذا كان استخدام مستودع عام

> lstModule = _ModuleRepository.GetAll().OrderBy(x => new { x.Level,
> x.Rank}).ToList();

آخر

> _db.Module.Where(x=> ......).OrderBy(x => new { x.Level, x.Rank}).ToList();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top