저도 두 테이블뿐 '영화' 와 '범주입니다', 그리고 내가 먼저 카테고리 id 로 이름을 순서화된 확보하십시오 의해 다음 목록.
이 영화는 3 열 표에 ID, 이름 및 카테고리 id .
뭔가 노력했다고 하지만, 다음과 같은 didn& # 39 빗나갔다.
var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })
Query syntax 비사양 람다 사용하여, linq, 이 작업을 수행할 수 있습니다.
var movies = from row in _db.Movies
orderby row.Category, row.Name
select row;
[EDIT 해결하십시오 주석문입니다] ',' 올림차순 여러_키워드 사용할 정렬 순서를 제어할 수 있는 것은, 따라서 기본값입니다 경우에 특히) '또는' 처럼 내림차순을 있습니다.
var movies = from row in _db.Movies
orderby row.Category descending, row.Name
select row;
추가 new" ";:
var movies = _db.Movies.OrderBy( m => new { m.CategoryID, m.Name })
자신에게 on my 기입란. 않니다 정렬하려면 복귀하십시오 생각하신거야 사용할 수 있습니다. 두 개의 값을 반환할 객체의.
하지만 다른 비슷한 정렬 결합됨 의해 열을 다음과 같습니다.
var movies = _db.Movies.OrderBy( m => (m.CategoryID.ToString() + m.Name))
아래 줄에 로깅하도록 너회의 다타콘테스트 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
난 그래서 니말은 서버리스 (아래), t # 39 hotenough. 일부 확장명은 don& 경우 이미 걱정하지 이케리이블 순서화된 방관하겠나 오더하려면 스케쳐내 의해 다음과 같이 여러 개의 속성 just do it.
// 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. 할 수 있는 방법을 사용하여 로베르비 ' ()' 에서는 '이콩파러'. 먼저 해야 합니다. '영화' 클래스 '를 구현하기 위한' 이콩파러 다음과 같습니다.
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 의 항목 중 하나가 바로 '비교' () 안의 스위치를 이에 따라 '방법' 의 모비에콤파레르.
일반 리포지토리를 사용할 경우
> lstModule = _ModuleRepository.GetAll().OrderBy(x => new { x.Level,
> x.Rank}).ToList();
다른
> _db.Module.Where(x=> ......).OrderBy(x => new { x.Level, x.Rank}).ToList();