簡體   English   中英

OrderBy列出LINQ查詢

[英]OrderBy list LINQ Query

我的模型包含Offers清單。 可提供擁有SpecialOffers價值true應該由orderd RGUOfferPriority 具有SpecialOffersfalse應僅由InitialPrice (降序)訂購。

我嘗試了以下查詢,它實現了第一部分,即由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是附加到每個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所有元素都應按ProviderCodeRGUOfferPriority排序,則可以將其用於第二個列表:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM