【问题标题】:Select max as second criteria with Linq使用 Linq 选择 max 作为第二个条件
【发布时间】:2018-08-23 13:58:42
【问题描述】:

我正在尝试获取具有某个字段的所有行 = 该字段的最大值

为了能够解释我的疑问,我会留下一个模型的例子

class model
{
    [Key]
    [Column(Order=0)]
    public int Key { get; set; }     

    [Key]
    [Column(Order=1)]
    public int Revision { get; set; }

    public string OtherStuff { get; set; }    
}

一个数据示例可以是

|Key|Revision   |Otherstuff |
|1  |1          |A          |
|1  |2          |B          |
|1  |3          |C          |
|2  |1          |D          |
|2  |2          |E          |
|3  |1          |F          |

我想得到什么:

|Key|Revision   |Otherstuff |
|1  |3          |C          |
|2  |2          |E          |
|3  |1          |F          |

我尝试了可以​​找到here 的解决方案,但我无法成功

这就是我得到的

IQueryable<model> data = dbContext.model;

data = data.GroupBy(x => x.Revision ).OrderByDescending(x => x.Key).SelectMany(x => x)

//Applying logic to filter the data 
data = data.Where(...)

我的主要问题是它是一种过滤方法,当使用 SelectMany 时,数据库已被处理,我无法继续根据需要修改列表

我想怎么做?

谢谢!

已解决

data = data.GroupBy(x => x.Key).Select(x => x.OrderByDescending(d => d.Revision).FirstOrDefault());

感谢所有回复!

【问题讨论】:

  • 删除 SelectMany。 GroupBy 返回一个二维数组 data[key, values[]]。 Where 或 Select 然后通过键枚举。然后,您可以进行第二次 Select,如下所示: data.Select(x => x.Where(y => .....)).SelectMany(x => x).ToList();

标签: c# linq entity-framework-6 linq-to-entities


【解决方案1】:

试试这个

data = data..GroupBy(x => x.Key).OrderByDescending(x => x.Key).Select(x => new { Key = x.Key, Revision = x.Count() });

【讨论】:

    【解决方案2】:
    var result = data.GroupBy(x => x.Revision).Select(x => x.First())
    

    如果您在第一次查询之后尝试执行任何其他操作(例如选择列的子集) - 您需要使用 x.FirstOrDefault

    【讨论】:

    • 通过一点突变,它设法解决了我的问题,非常感谢!
    【解决方案3】:
    data = data.GroupBy(x => x.Revision).Select(revisitions => revisitions.OrderByDescending(x => x.Key).First())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多