【问题标题】:Max and min record from database using Entity Framework Core使用 Entity Framework Core 从数据库中获取最大和最小记录
【发布时间】:2019-07-11 01:58:17
【问题描述】:

我有一个简单的方法,根据一些参数从 db 返回 rage 数据,很简单:

public async Task<IEnumerable<P2PStats>> GetFilteredNetStats(ushort id, ushort remoteId, DateTime start, DateTime end)
{
    using (var ctx = new DataContext())
    {
        IQueryable<P2PStats> query = ctx.P2PStats
             .Where(stat => stat.Id == id && stat.Date >= start && stat.Date <= end)
             .Where(stat => stat.P2PStatsDetailed.Any(detail => detail.RemoteId == remoteId))
             .Select(stat => new P2PStats
             {
                 Id = stat.Id,
                 AxmCardId = stat.Id,
                 Date = stat.Date,
                 P2PStatsDetailed = stat.P2PStatsDetailed.Where(detail => detail.RemoteId == remoteId).ToList()
             });

        return await query.ToListAsync();
    }
}

它返回 P2PStats 的集合(实际上是一个任务,但最终结果是一个集合)。可以对此进行修改,以便我只能从数据库中获取 2 个值,首先是最低日期,其次是最高日期?

我尝试了 Max 和 Min,但仅在查询具体化之后我才得到 max 和 min 值或属性而不是整个记录。

【问题讨论】:

  • 由于您按 id 过滤,集合不会只返回一项吗?

标签: c# .net-core entity-framework-core


【解决方案1】:

这个问题可以通过去掉 Id 过滤和在你的代码中添加方法.Max().Min() 来解决。

下面是一个示例:

 public async Task<IEnumerable<P2PStats>> GetNetStatsLowestAndHighestDate(ushort id, ushort remoteId, DateTime start, DateTime end)
{
    using (var ctx = new DataContext())
    {
        IQueryable<P2PStats> query = ctx.P2PStats
             .Where(stat => stat.Date >= start && stat.Date <= end)
             .Where(stat => stat.P2PStatsDetailed.Any(detail => detail.RemoteId == remoteId))
             .DefaultIfEmpty(0)
             .Max(s => s.Date)

             .Select(stat => new P2PStats
                                        {
                                            Id = stat.Id,
                                            AxmCardId = stat.Id,
                                            Date = stat.Date,
                                            P2PStatsDetailed = stat.P2PStatsDetailed.Where(detail => detail.RemoteId == remoteId).ToList()
                                        });

        IQueryable<P2PStats> query2 = ctx.P2PStats
             .Where(stat => stat.Date >= start && stat.Date <= end)
             .Where(stat => stat.P2PStatsDetailed.Any(detail => 
        detail.RemoteId == 
        remoteId))
             .DefaultIfEmpty(0)
             .Min(s => s.Date)

             .Select(stat => new P2PStats
                                        {
                                            Id = stat.Id,
                                            AxmCardId = stat.Id,
                                            Date = stat.Date,
                                            P2PStatsDetailed = 
        stat.P2PStatsDetailed.Where(detail => detail.RemoteId == remoteId).ToList()
                                        });

        var results = query1.Concat(query2);

        return await results.ToListAsync();

    }
}

【讨论】:

    【解决方案2】:

    我假设您有相同 ID 的记录。刚刚创建了一个 linqpad 示例(我不确定您是想要最小值、最大值行列表还是只需要最小值和最大值) 方法是在同一字段上分组(可能在 ID 上)并选择最小值、最大值

    void Main()
    {
        test t = new test();
        var l = new List<test>() {
            new test() {ID = 0, a1="aaa", a2 = 10},
            new test() {ID = 1, a1="aaa", a2 = 40},
            new test() {ID = 2, a1="aaa", a2 = 70},
            new test() {ID = 3, a1="aaa", a2 = 50},
            };
    
        l.Dump("original");
        l.GroupBy(g => g.a1).Select(s => new { max = s.Max(mm => mm.a2), min = s.Min(mi => mi.a2) }).Dump("return 2 values");
    
        List<test> lRes = new List<test>();
        lRes.Add(l.OrderBy(o => o.a2).First());
        lRes.Add(l.OrderBy(o => o.a2).Last());
        lRes.Dump("return table of min record and max record");
    
    
    }
    
    public class test
    {
        public int ID { get; set; }
        public string a1 { get; set; }
        public int a2 { get; set; }
        public test() { }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2022-12-31
      • 2020-12-15
      • 1970-01-01
      相关资源
      最近更新 更多