질문자 :Sasha
나는 두 개의 테이블, movies
및 categories
가 있으며 categoryID 순으로 정렬된 목록을 먼저 얻은 다음 Name 순으로 정렬된 목록을 얻고 싶습니다.
영화 테이블에는 ID, Name 및 CategoryID 세 개의 열이 있습니다. 범주 테이블에는 두 개의 열 ID 및 이름이 있습니다.
나는 다음과 같은 것을 시도했지만 작동하지 않았습니다.
var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })
이것은 당신을 위해 작동합니다:
var movies = _db.Movies.OrderBy(c => c.Category).ThenBy(n => n.Name)
Nathan W람다가 아닌 쿼리 구문 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;
Scott Stafford새로운 걸 더하다":
var movies = _db.Movies.OrderBy( m => new { m.CategoryID, m.Name })
내 상자에서 작동합니다. 정렬에 사용할 수 있는 항목을 반환합니다. 두 개의 값을 가진 객체를 반환합니다.
다음과 같이 결합된 열을 기준으로 정렬하는 것과 유사하지만 다릅니다.
var movies = _db.Movies.OrderBy( m => (m.CategoryID.ToString() + m.Name))
AlexDataContext에서 다음 행을 사용하여 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
Oliver SlayIQueryable이 이미 주문되었는지 여부에 대해 걱정할 필요가 없도록 몇 가지 확장 메서드(아래)를 만들었습니다. 여러 속성으로 정렬하려면 다음과 같이 하십시오.
// 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); } } }
sjkm가장 쉬운 것은 아니지만 LINQ를 사용하여 이 작업을 수행하는 방법이 하나 더 있습니다. 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());
항목 중 하나에 대해 내림차순으로 순서를 전환해야 하는 경우 MovieComparer
Compare()
메서드 내에서 x와 y를 전환하면 됩니다.
prudentcoder일반 저장소를 사용하는 경우
> lstModule = _ModuleRepository.GetAll().OrderBy(x => new { x.Level, > x.Rank}).ToList();
또 다른
> _db.Module.Where(x=> ......).OrderBy(x => new { x.Level, x.Rank}).ToList();
Saint-martin Guillaume출처 : http:www.stackoverflow.com/questions/298725/multiple-order-by-in-linq