You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core Web API中CS1061错误:DateTime?无Date属性的解决

解决ASP.NET Core Web API中DateTime?的Date属性访问错误

问题场景

在ASP.NET Core Web API中定义了以下DTO和查询方法:

DTO代码

public class PagingDto
{
    public int PageSize { get; set; }
    public int PageNumber { get; set; }
}

public class TransactionFilter : PagingDto
{
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
    public string SearchQuery { get; set; }
}

GetAllTransactions方法

public IQueryable<Transaction> GetAllTransactions(TransactionFilter filter)
{
    var transactions = _context.Transactions
        .Where(x => x.CreatedDate.Date >= filter.StartDate && x.CreatedDate.Date <= filter.EndDate)
        .Where(x => string.IsNullOrEmpty(filter.SearchQuery) || x.Customer.Name.ToLower().Contains(filter.SearchQuery.ToLower())
    || x.Payment.Status.ToLower().Contains(filter.SearchQuery.ToLower())
    || x.Payment.TransactionReference.ToLower().Contains(filter.SearchQuery.ToLower())
    || x.Payment.MethodOfPayment.ToLower().Contains(filter.SearchQuery.ToLower())
    || x.Payment.Amount.ToString().Contains(filter.SearchQuery))
        .Include(b => b.Payment)
        .Include(b => b.Customer)
        .OrderByDescending(transaction => transaction.CreatedDate);
    return transactions;
}

运行时出现以下错误:

Severity    Code    Description Project File    Line    Suppression State
Error   CS1061  'DateTime?' does not contain a definition for 'Date' and no accessible extension method 'Date' accepting a first argument of type 'DateTime?' could be found (are you missing a using directive or an assembly reference?)

错误出现在Where(x => x.CreatedDate.Date >= filter.StartDate && x.CreatedDate.Date <= filter.EndDate)的Date属性访问处。

问题原因

filter.StartDate和filter.EndDate是可空DateTime类型(DateTime?),而x.CreatedDate.Date是普通DateTime类型:

  1. 可空类型无法直接访问Date属性,必须先获取其非空值
  2. 直接将DateTime类型与DateTime?类型比较会导致类型不匹配
  3. 未考虑StartDate或EndDate为null的场景

解决方法

方案1:安全处理可空值(推荐)

如果允许StartDate/EndDate为null(即不启用该过滤条件),可以分别判断空值,避免空引用异常:

.Where(x => (filter.StartDate == null || x.CreatedDate.Date >= filter.StartDate.Value.Date)
         && (filter.EndDate == null || x.CreatedDate.Date <= filter.EndDate.Value.Date))
  • 当StartDate为null时,该条件自动成立,不会过滤数据
  • 当StartDate有值时,才会执行日期比较逻辑

方案2:使用GetValueOrDefault()处理默认值

如果希望参数为null时使用默认日期范围(比如最小/最大日期),可以用GetValueOrDefault():

.Where(x => x.CreatedDate.Date >= filter.StartDate.GetValueOrDefault(DateTime.MinValue).Date
         && x.CreatedDate.Date <= filter.EndDate.GetValueOrDefault(DateTime.MaxValue).Date)
  • 当参数为null时,会使用DateTime.MinValue或DateTime.MaxValue作为默认值,确保查询覆盖全量数据

方案3:EF Core查询性能优化(进阶)

直接使用Date属性可能导致EF Core无法利用数据库索引,建议调整为范围查询,避免全表扫描:

.Where(x => (filter.StartDate == null || x.CreatedDate >= filter.StartDate.Value.Date)
         && (filter.EndDate == null || x.CreatedDate < filter.EndDate.Value.Date.AddDays(1)))
  • 对于EndDate,使用x.CreatedDate < EndDate.Date.AddDays(1)替代x.CreatedDate.Date <= EndDate.Date,这样可以匹配EndDate当天的所有时间点数据,同时能利用日期索引

内容的提问来源于stack exchange,提问作者Ayobamilaye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:53:31