2016-09-27 4 views
1

내 모델 Offers 목록이 포함되어 있습니다. SpecialOffers 값이 true 인 주문은 RGUOfferPriority으로 주문해야합니다. SpecialOffers 값이 false 인 제안은 InitialPrice (내림차순)으로 주문해야합니다.주문 탭 목록 LINQ 쿼리

다음과 같은 쿼리를 시도했습니다. 즉, RGUOfferPriority으로 정렬 된 첫 번째 부분을 얻었지 만 이는 SpecialOffers에도 적용됩니다. 이 두 가지 작업을 수행하기위한 쿼리는 무엇이되어야합니까?

List<OfferModel> providerOffers = Model.Offers 
    .Where(x => x.Provider.ProviderCode.Equals(provider)) 
    .OrderByDescending(o => o.SpecialOffer) 
    .ThenByDescending(t => t.RGU) 
    .ThenBy(p => p.OfferPriority) 
    .Select(x => x) 
    .ToList(); 

편집SpecialOffer는 안 들려요 위해 두 개의 서로 다른, 제안 특별 여부를 결정 또는 당신은 자신의 유형에 따라 목록을 분할하지

+0

을 그래서, 당신은 필요합니까? – tym32167

+5

'''.Select (x => x)'''<- 쓸모 없음 – tym32167

+0

콜렉션은 동일합니다. 각 오퍼의 'SpecialOffer' 속성은 그것의 SpecialOffer가 –

답변

3

당신해야 별도로 주문할 수 두 그룹 얻기 위해이 속성에 의해 첫 번째 그룹 :

var offers = Model.Offers.Where(o => o.Provider.ProviderCode.Equals(provider)); 
var offerGroups = offers.GroupBy(o => o.SpecialOffer); 
var specialGroup = offerGroups.Where(g => g.Key == true) 
    .SelectMany(g => g) 
    .OrderByDescending(o => o.InitialPrice); 
var nonSpecialGroup = offerGroups.Where(g => g.Key == false) 
    .SelectMany(g => g) 
    .OrderByDescending(t => t.RGU) 
    .ThenBy(p => p.OfferPriority); 
var result = specialGroup.Concat(nonSpecialGroup).ToList(); 

LINQ의 지연된 실행으로 인해 이러한 쿼리를 단일 SQL 쿼리로 실행됩니다.


부인 성명 : 생성 된 SQL이 그룹의 순서를 지키면 내가 일반적으로 당신이 마지막 CONCAT입니다 외부 쿼리에 ORDER BY을 적용해야 확실하지 않다, 그것은 UNION ALL로 번역합니다. 그런 다음 가장 쉬운 AsEnumerableLinq-To-Objects을 사용하는 것입니다 : 2 명 개의 다른 컬렉션을 정렬 할

var result = specialGroup.AsEnumerable().Concat(nonSpecialGroup.AsEnumerable()).ToList(); 
+0

고맙습니다. 이것은 완벽하게 작동합니다. 아주 좋은 설명. 엄지 위로 (y) –

0

각각 제공에 부착 된 부울 속성입니다 같은 문 목록 :

var result1 = model.Offers.Where(x => x.SpecialOffer).OrderBy(x => x.InitialPrice); 
var result2 = model.Offers.Except(result1).OrderBy(...); 

아닌 경우 SpecialOfferProviderCode으로 분류해야하지 목록 내의 모든 요소를, RGUOfferPriority 당신은 두 번째 목록이를 사용할 수 있습니다

var result2 = mode.Offers.Where(x => !x.SpecialOffer) 
    .Where(x => x.Provider.ProviderCode.Equals(provider)) 
    .OrderByByDescending(t => t.RGU) 
    .ThenBy(p => p.OfferPriority);