[英]OrderBy list LINQ Query
我的模型包含Offers
清單。 可提供擁有SpecialOffers
價值true
應該由orderd RGU
和OfferPriority
。 具有SpecialOffers
值false
應僅由InitialPrice
(降序)訂購。
我嘗試了以下查詢,它實現了第一部分,即由RGU
和OfferPriority
排序,但這也適用於非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
是附加到每個SpecialOffer
的布爾屬性,用於確定商品是否為特價商品
您應該首先按此屬性進行分組,以獲得兩個可以單獨訂購的組:
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是否會保持組的順序,通常你必須在外部查詢上應用ORDER BY
,這是最終的CONCAT
,它被轉換為UNION ALL
。 那么最簡單的方法是使用帶有AsEnumerable
Linq-To-Objects
:
var result = specialGroup.AsEnumerable().Concat(nonSpecialGroup.AsEnumerable()).ToList();
您必須根據類型拆分列表,不能使用相同的語句訂購兩個不同的列表:
var result1 = model.Offers.Where(x => x.SpecialOffer).OrderBy(x => x.InitialPrice);
var result2 = model.Offers.Except(result1).OrderBy(...);
如果不是列表中不是SpecialOffer
所有元素都應按ProviderCode
, RGU
和OfferPriority
排序,則可以將其用於第二個列表:
var result2 = mode.Offers.Where(x => !x.SpecialOffer)
.Where(x => x.Provider.ProviderCode.Equals(provider))
.OrderByByDescending(t => t.RGU)
.ThenBy(p => p.OfferPriority);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.