Максимальная и минимальная запись из базы данных с использованием Entity Framework Core - PullRequest
0 голосов
/ 10 июля 2019

У меня есть простой метод, который возвращает ярость данных из БД по некоторым параметрам, и это просто:

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, но только после того, как запрос материализован, и я получаю максимальное или минимальное значение или свойство, а не целую запись.

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Я предполагаю, что у вас есть записи для того же ID. только что создал пример linqpad (я не был уверен, хотите ли вы список минимального значения, максимального значения строки или просто минимальное и максимальное) подход будет заключаться в группировке по одному и тому же полю (вероятно, по идентификатору) и выборе 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() { }
}

0 голосов
/ 10 июля 2019

Эта проблема может быть решена удалением фильтрации по 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();

    }
}
...