C# LINQ 自定义排序方式

标签 c# linq

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

我有以下类(class):-

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;} 

}

我想返回按其 OpportunityProducts 总和排序的机会列表,例如:-

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

一个机会可以有多个机会产品,一个机会产品的“值(value)”因销售类型而异。

一个例子如下:-

//Rental Products
var rentalValue = SaleValue * 12;

//Purchase Products
var saleValue = SaleValue;

一个机会也可以有多种不同类型的机会产品,也就是一个机会可能有一个销售作为一个机会产品,一个租赁作为另一个机会产品。

排序是根据 ICollection 的总值(value),也就是每个单独的 OpportunityProduct 的总和。

谢谢,

最佳答案

The sorting is by the Total Value of the ICollection aka the sum of each individual OpportunityProduct.

然后您需要在 OrderBy 中使用 Sum(...):

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

关于C# LINQ 自定义排序方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48480871/

相关文章:

c# - 减少用于过滤的 linq 查询

c# - IEnumerable.Cast() 与 IEnumerable.Select() 中的转换

c# - 将包含 where、group by、sum 和having 的 MySQL 语句转换为 Linq to Sql

C#如何根据概率生成随机数

c# - MonoTouch 应用程序在模拟器中运行,但不在设备上运行

c# - 在树结构中通过 ID 属性定位实例

c# - 有没有办法跟踪数据上下文何时访问数据库?

c# - 生成 Word 文档的缩略图

c# - Razor:方法 'Write' 没有重载需要 0 个参数

c# - Umbraco 自定义部分中的多级树