etc./StackOverFlow

LINQ의 여러 "주문"

청렴결백한 만능 재주꾼 2022. 1. 6. 11:11
반응형

질문자 :Sasha


나는 두 개의 테이블, moviescategories 가 있으며 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))

Alex

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을 생성합니다(Name 및 CategoryId가 전환됨).

 SELECT [t0].ID, [t0].[Name], [t0].CategoryID FROM [dbo].[Movies] as [t0] ORDER BY [t0].[Name], [t0].CategoryID

Oliver Slay

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

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

반응형