متعدد "ترتيب" في LINQ


Answers

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

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

[EDIT to comment comment] للتحكم في ترتيب الفرز ، استخدم الكلمات الرئيسية ascending (وهو الإعداد الافتراضي وبالتالي غير مفيد بشكل خاص) أو descending ، مثل:

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

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

يحتوي جدول الفيلم على ثلاثة أعمدة ، معرّف ، اسم ، و CategoryID . يحتوي جدول الفئات 2 على أعمدة ومعرف واسم .

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

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



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

_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 التالي (يتم تبديل اسم و CategoryId):

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

يكون هذا مفيدًا بشكل خاص إذا قمت بإنشاء الترتيب ديناميكيًا ، من قائمة خصائص لفرزها.

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