2016-09-27 143 views
1

我的模型包含的列表Offers。具有SpecialOffers价值true的报价应该由RGUOfferPriority订购。 SpecialOffers价值false的报价应仅由InitialPrice(降序)订购。OrderBy list 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

所以,你需要2点不同的集合进行排序? – 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。那么最简单的办法是使用Linq-To-ObjectsAsEnumerable

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(...); 

如果不是那不是SpecialOffer应该ProviderCode排序列表中的所有元素,RGUOfferPriority您可以使用此为第二个列表:

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