簡體   English   中英

使用Entity Framework Core從數據庫記錄的最大和最小

[英]Max and min record from database using Entity Framework Core

我有一個簡單的方法,可以根據一些參數從db返回大量數據,這很簡單:

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的集合(實際上是一個任務,但最終結果是一個集合)。 可以對此進行修改,以便我只能從數據庫中獲得兩個值最低的日期,第二個具有最高的日期嗎?

我嘗試了最大和最小,但僅在查詢實現后才出現,最終得到的是最大和最小值或屬性,而不是整個記錄。

此問題可以通過刪除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();

    }
}

我假設您有相同ID的記錄。 剛剛創建了一個linqpad示例(我不確定您是否要列出最小值,最大值行或僅列出min和max),方法是將同一字段分組(適當地在ID上)並選擇min,max

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() { }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM