質問

movies categories の2つのテーブルがあり、最初に categoryID で、次に Name

ムービーテーブルには、 ID、Name、CategoryID の3つの列があります。 カテゴリテーブル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;

[コメントに対処する編集]ソート順を制御するには、キーワード 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 })

それは私のボックスで動作します。ソートに使用できるものを返します。 2つの値を持つオブジェクトを返します。

似ていますが、次のように結合列によるソートとは異なります。

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;

AND

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;

AND

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

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

LINQを使用してこれを行う方法が少なくとも1つありますが、最も簡単ではありません。 これを行うには、 IComparer を使用する OrberBy()メソッドを使用します。最初に必要なこと 次のように、 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とyを切り替えるだけです。 それに応じて MovieComparer のメソッド。

汎用リポジトリを使用する場合

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

else

> _db.Module.Where(x=> ......).OrderBy(x => new { x.Level, x.Rank}).ToList();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top