// 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);
}
}
}
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());
7条答案
按热度按时间polhcujo1#
这应该对您有效:
tzcvj98z2#
使用非lambda查询语法LINQ,您可以执行以下操作:
[EDIT to address comment]要控制排序顺序,请使用关键字
ascending
(这是默认值,因此不是特别有用)或descending
,如下所示:7gcisfzg3#
新增:
这在我的盒子上有效。它确实返回了一些可以用来排序的东西。它返回了一个有两个值的对象。
与按组合列排序类似,但不同,如下所示。
rpppsulh4#
在
DataContext
上使用下面的行,将DataContext
上的SQL活动记录到控制台-然后您可以确切地看到您的LINQ语句正在从数据库请求什么:以下LINQ语句:
以及
生成以下SQL:
然而,在LINQ中重复
OrderBy
,似乎会反转生成的SQL输出:以及
生成以下SQL(Name和CategoryId已交换):
7uhlpewt5#
我已经创建了一些扩展方法(如下所示),所以你不必担心IQueryable是否已经排序。如果你想按多个属性排序,只需按如下所示操作:
如果您动态创建排序(例如,从要排序的属性列表中),则此功能特别有用。
gk7wooem6#
使用LINQ至少还有一种方法可以做到这一点,尽管这不是最简单的方法。您可以通过使用
IComparer
的OrberBy()
方法来做到这一点。首先,您需要为Movie
类实现一个IComparer
,如下所示:然后,您可以使用以下语法订购影片:
如果您需要将其中一个项目的排序切换为降序,只需相应地切换
MovieComparer
的Compare()
方法中的x和y即可。6ie5vjzr7#
如果使用通用存储库
其他