LINQ中的多个“排序依据”

4nkexdtk  于 2022-12-06  发布在  其他
关注(0)|答案(7)|浏览(172)

我有两个表,moviescategories,我想先按categoryID,然后按Name获得一个有序列表。
movie数据表有三个数据行ID、Name和CategoryID。category数据表有两个数据行ID和Name
我尝试了类似以下的方法,但没有成功。

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

polhcujo1#

这应该对您有效:

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

tzcvj98z2#

使用非lambda查询语法LINQ,您可以执行以下操作:

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

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

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

7gcisfzg3#

新增:

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

这在我的盒子上有效。它确实返回了一些可以用来排序的东西。它返回了一个有两个值的对象。
与按组合列排序类似,但不同,如下所示。

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

rpppsulh4#

DataContext上使用下面的行,将DataContext上的SQL活动记录到控制台-然后您可以确切地看到您的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]

然而,在LINQ中重复OrderBy,似乎会反转生成的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(Name和CategoryId已交换):

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

7uhlpewt5#

我已经创建了一些扩展方法(如下所示),所以你不必担心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);
        }
    }
}
gk7wooem

gk7wooem6#

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

如果您需要将其中一个项目的排序切换为降序,只需相应地切换MovieComparerCompare()方法中的x和y即可。

6ie5vjzr

6ie5vjzr7#

如果使用通用存储库

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

其他

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

相关问题