LINQ 按多个属性分组并查找另一个属性的最大值和最小值

问题描述 投票:0回答:1

我有一个存储在列表中的模型:

public class OrderDataModel
{
    public string Product {  get; set; }
    public string Registry { get; set; }
    public string ProjectID { get; set; }
    public string ProjectName { get; set; }
    public string ProjectTypeProtocol { get; set; }
    public string ProjectGeography { get; set; }
    public string Vintage { get; set; }
    public string CCBQualified {  get; set; }
    public string CorsiaEligible { get; set; }
    public int? BidQty { get; set; }
    public decimal? Bid {  get; set; }
    public int? AskQty { get; set; }
    public decimal? Ask { get; set; }
    public string? ExecutionVenue { get; set; }
}

我有上述内容的清单。 我想获取所有匹配“产品”、“ProjectID”、“Vintage”、“CCBQualified”、“CorsiaEligible”和“ExecutionVenue”的“出价”金额的最大值和“要价”金额的最小值仅当计数大于一时。 因此,如果存在不匹配的项目,请忽略这些项目。

我尝试写这样的东西:

ordersModel
    .GroupBy(a => new { a.ProjectID, a.Product, a.Vintage, a.CCBQualified, a.CorsiaEligible, a.ExecutionVenue })
    .Select(b => new 
    {
        ProjectID = b.Key.ProjectID,
        Product = b.Key.Product, 
        Vintage = b.Key.Vintage, 
        CCBQualified = b.Key.CCBQualified, 
        ExecutionVenue = b.Key.ExecutionVenue, 
        max = b.Max(c => c.Bid), 
        min = b.Min(c => c.Ask)
    });

我在没有分组的情况下得到了很多结果,并且很多 ProjectID 都是空白的。 我认为我没有正确执行选择部分,以及如何表示仅在所有这些值都匹配的情况下才进行选择。

我可以做这样的事情吗:

ordersModel
    .GroupBy(a => new { a.ProjectID, a.Product, a.Vintage, a.CCBQualified, a.CorsiaEligible, a.ExecutionVenue })
    .Select(b => new 
    {
        ProjectID = b.Key.ProjectID,
        Product = b.Key.Product, 
        Vintage = b.Key.Vintage, 
        CCBQualified = b.Key.CCBQualified, 
        ExecutionVenue = b.Key.ExecutionVenue, 
        max = b.Max(c => c.Bid), 
        min = b.Min(c => c.Ask), 
        count = b.Count()
    });

添加计数字段,如果计数 > 1,则检索该记录?

c# linq grouping
1个回答
0
投票

在 LINQ 中包含

Where
子句

ordersModel
    .GroupBy(a => new { a.ProjectID, a.Product, a.Vintage, a.CCBQualified, a.CorsiaEligible, a.ExecutionVenue })
    .Where(g => g.Count() > 1)
    .Select(b => new 
    {
        ProjectID = b.Key.ProjectID,
        Product = b.Key.Product, 
        Vintage = b.Key.Vintage, 
        CCBQualified = b.Key.CCBQualified, 
        ExecutionVenue = b.Key.ExecutionVenue, 
        max = b.Max(c => c.Bid), 
        min = b.Min(c => c.Ask)
    });
© www.soinside.com 2019 - 2024. All rights reserved.