繁体   English   中英

如何获得前 1 个月的年龄记录

[英]How to get the 1 month before records with age

我的 FilterByAgeRequest 类结构

public class FilterByAgeRequest
{
    [Required(ErrorMessage = "Username required")]
    public string userName { get; set; }
    public DateTime? from { get; set; }
    public DateTime? fromTo { get; set; }
}

我想用计数计算不同的年龄。

var query = await _dataContext.Users
                        .Where(p => p.UserDob != null && p.CreatedAt >= request.from.Date && p.CreatedAt <= request.fromTo.Date) // exclude null DOB's from stats
                        .GroupBy(p => p.UserDob.Year)
                        .Select(g => new FilterByAgeResponseCls{  Age = DateTime.Now.Year - g.Key, Count = g.Count() })
                        .OrderBy(g => g.Age).ToListAsync().ConfigureAwait(true);

上面的查询执行得很好,但现在我有了新的条件。 如果 from 和 fromTo 为NULL我想从今天日期检索用户年龄数据前一个月的数据。 如何在 linq 中检查 from 和 fromTo。

提前致谢。

您需要在Where子句中添加条件(request.from != null && request.fromTo != null)如下:

var query = await _dataContext.Users
                            .Where(p => p.UserDob != null && 
                                ((request.from != null && request.fromTo != null) 
                                ? //It means from and fromTo is not null 
                                    (p.CreatedAt >= request.from.Date && p.CreatedAt <= request.fromTo.Date) 
                                : // else means if from or fromTo is null then retrieve data from last one  month
                                    p.CreatedAt > DateTime.Now.AddMonths(-1) )) 
                            .GroupBy(p => p.UserDob.Year)
                            .Select(g => new FilterByAgeResponseCls{  Age = DateTime.Now.Year - g.Key, Count = g.Count() })
                            .OrderBy(g => g.Age).ToListAsync().ConfigureAwait(true);

您可以尝试使用此代码,它不需要太多更改并且可以更好地控制日期边界:

DateTime from;
DateTime to;

if( request.from == null || request.fromTo == null )
{
  from = DateTime.Now.Date.AddMonths(-1);  
  to = DateTime.Now.Date.AddMonths(-1).AddDays(1);
}
else
{
  from = request.from.Date;
  to = request.fromTo.Date;
}

var query = await _dataContext.Users
              .Where(p => p.UserDob != null && p.CreatedAt >= from && p.CreatedAt <= to) // exclude null DOB's from stats
              .GroupBy(p => p.UserDob.Year)
              .Select(g => new FilterByAgeResponseCls{  Age = DateTime.Now.Year - g.Key, Count = g.Count() })
              .OrderBy(g => g.Age).ToListAsync().ConfigureAwait(true);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM