문제
나는 두 개의 테이블이 있습니다. movies
그리고 categories
, 그리고 나는 주문 목록을받습니다 카테고리 먼저 이름.
영화 테이블에는 3 개의 열이 있습니다. ID, 이름 및 범주 ID. 카테고리 표 2에는 열이 있으며 신분증과 이름.
나는 다음과 같은 것을 시도했지만 효과가 없었습니다.
var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })
해결책
이것은 당신에게 효과가 있어야합니다 :
var movies = _db.Movies.OrderBy(c => c.Category).ThenBy(n => n.Name)
다른 팁
LAMBDA가 아닌 Query-Syntax 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 })
그것은 내 상자에 작동합니다. 분류하는 데 사용할 수있는 것을 반환합니다. 두 값으로 객체를 반환합니다.
유사하지만 다음과 같이 결합 된 열로 정렬하는 것과 다릅니다.
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에서 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을 생성합니다 (이름 및 카테고리가 전환).
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를 사용 하여이 작업을 수행하는 방법은 가장 쉽지는 않지만 적어도 하나 이상의 방법이 있습니다. 당신은 그것을 사용하여 할 수 있습니다 OrberBy()
an을 사용하는 방법 IComparer
. 먼저 구현해야합니다 IComparer
용 Movie
다음과 같은 클래스 :
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를 Compare()
방법의 방법 MovieComparer
따라서.
일반 저장소를 사용하는 경우
> lstModule = _ModuleRepository.GetAll().OrderBy(x => new { x.Level,
> x.Rank}).ToList();
또 다른
> _db.Module.Where(x=> ......).OrderBy(x => new { x.Level, x.Rank}).ToList();