首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用实体框架核心从数据库中获取最大和最小记录

使用实体框架核心从数据库中获取最大和最小记录
EN

Stack Overflow用户
提问于 2019-07-10 23:07:34
回答 2查看 66关注 0票数 0

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

代码语言:javascript
复制
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值或属性,而不是整个记录。

EN

回答 2

Stack Overflow用户

发布于 2019-07-11 00:27:30

这个问题可以通过删除按Id过滤并在代码中添加.Max().Min()方法来解决。

下面是一个示例,说明这是什么样子:

代码语言:javascript
复制
 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();

    }
}
票数 0
EN

Stack Overflow用户

发布于 2019-07-11 01:58:18

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56973675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档