LINQ中的多个“order by”

我有两个表,moviescategories,我想先按分类名字然后按姓名获取有序列表。

电影表有三列ID、名称和类别ID。类别表有两列id和姓名

我尝试了以下方法,但它不起作用。

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

这应该为你工作:

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

使用非lambda查询语法LINQ,您可以这样做:

var movies = from row in _db.Moviesorderby row.Category, row.Nameselect row;

要控制排序顺序,请使用关键字ascending(这是默认值,因此不是特别有用)或descending,如下所示:

var movies = from row in _db.Moviesorderby row.Category descending, row.Nameselect row;

添加“新”:

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

这适用于我的盒子。它确实返回了一些可用于排序的东西。它返回一个有两个值的对象。

与按组合列排序类似,但不同,如下所示。

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

使用LINQ至少还有一种方法可以做到这一点,尽管不是最简单的。您可以使用使用IComparerOrberBy()方法来做到这一点。首先,您需要为Movie类实现IComparer,如下所示:

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

如果您需要将其中一个项目的顺序切换为降序,只需在Compare()中切换x和yMovieComparer的方法。

DataContext上使用以下行将DataContext上的SQL活动记录到控制台-然后您可以确切地看到您的LINQ语句从数据库请求的内容:

_db.Log = Console.Out

以下LINQ语句:

var movies = from row in _db.Moviesorderby row.CategoryID, row.Nameselect row;

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

制作以下SQL:

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

然而,在LINQ中重复OrderBy,似乎会反转结果SQL输出:

var movies = from row in _db.Moviesorderby row.CategoryIDorderby row.Nameselect row;

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

生成以下SQL(名称和类别ID切换):

SELECT [t0].ID, [t0].[Name], [t0].CategoryIDFROM [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 priorityqueryable.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);}}}

如果使用通用存储库

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

否则

> _db.Module.Where(x=> ......).OrderBy(x => new { x.Level, x.Rank}).ToList();