首页 > 解决方案 > 如何获得前1个月的年龄记录

问题描述

我的 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。

提前致谢。

标签: c#linq

解决方案


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

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);

推荐阅读