我有两个表,moviescategories,和我得到一个有序列表的categoryID ,然后再通过命名

在电影表具有三列,的 ID,名称和类别ID 即可。 类别表2中的列,的 ID和名称

我试图像下面,但没有奏效。

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;

[EDIT解决评论为了控制的排序顺序,使用的关键字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以下行对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的反复进行排序依据,会出现扭转产生的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(名称和类别ID切换):

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.E.从属性进行排序的列表。

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方法做到这一点。首先,你需要 实现用于Movie类像这样的Compare()

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