C#LINQ自定义排序依据

时间:2018-01-27 21:43:37

标签: c# linq

我在确定是否可以使用LINQ对类进行自定义排序或是否需要手动进行排序时遇到问题。

我有以下课程: -

public class Opportunity : BaseEntity {

[Key]
public int OpportunityID { get; set; }

public virtual ICollection<OpportunityProduct> OpportunityProducts { get; set;}

}

public class OpportunityProduct : BaseEntity {

[Key]
public int OpportunityProductID { get; set; }
public SaleType SaleType { get; set; }
public decimal SaleValue { get;set;} 

}

我想返回按商机产品总和排序的商机列表,例如: -

var opportunities = opportunities.OrderBy( o => o.OpportunityProducts.xxx).ToList();

机会可以有许多机会产品,而OpportunityProduct的“价值”因SaleType而异。

这方面的一个例子如下: -

//Rental Products
var rentalValue = SaleValue * 12;

//Purchase Products
var saleValue = SaleValue;

机会也可以有多种不同类型的OpportunityProducts,也就是说机会可以将Sale作为一个OpportunityProduct而租赁作为另一个机会产品。

排序是ICollection的总价值,也就是每个OpportunityProduct的总和。

谢谢,

1 个答案:

答案 0 :(得分:1)

  

排序是ICollection的总价值,也就是每个人OpportunityProduct的总和。

然后您需要Sum(...)中的OrderBy

var orderedOpportunities = opportunities
    .OrderByDescending( o => o.OpportunityProducts.Sum(p => p.SaleValue))
    .ToList();

使用OrderByDescending会优先考虑列表开头的最高机会。

请注意,此方法假设所有商机产品同时适用,即您可以同时销售租赁商品。如果不是这种情况,请使用Max代替Sum

var orderedOpportunities = opportunities
    .OrderByDescending( o => o.OpportunityProducts.Max(p => p.SaleValue))
    .ToList();