我正在尝试检查linq中的日期是否为空,如果没有检查它的未来日期。
QuestionnaireRepo.FindAll(q => !q.ExpiredDate.HasValue || q.ExpiredDate >DateTime.Now).OrderByDescending(order => order.CreatedDate);
我需要第二张支票才能申请,如果第一张是真的。我使用单个存储库模式,FindAll接受了where子句
任何想法?这里有很多类似的问题,但没有给出答案,我对Linq很新,你可能已经猜到了:)
编辑:我现在得到了我需要的结果,但它会检查>在某些情况下以null值为条件。这不是坏事吗?
答案 0 :(得分:8)
这不会起作用吗?
QuestionnaireRepo.FindAll(
q => (q.ExpiredDate == null) || (q.ExpiredDate > DateTime.Now));
答案 1 :(得分:2)
如果这是Linq-to-Sql或Linq-To-Entities,则HasValue将不会转换为SQL表达式,您将获得异常。
这应该这样做。
QuestionnaireRepo.FindAll(q => q.ExpiredDate != null && q.ExpiredDate <= DateTime.Now)
答案 2 :(得分:1)
有几种方法可以做到这一点,一种很好的方法是使用管道和过滤器,但看看你是如何实现上述的,它看起来不像你正在使用这种模式所以不会去进入它,但它值得谷歌搜索。
使用Pipes and Filters模式,您可以执行此操作:
public static IQueryable<YourType> WithExpiryDate(this IQueryable<YourType> allMyTypes)
{
return allMyTypes.Where(f => f.ExpiredDate != null);
}
public static IQueryable<YourType> WhereExpiredDateBeforeThanNow(this IQueryable<YourType> allMyTypes)
{
return allMyTypes.Where(f => f.ExpiredDate <= DateTime.Now);
}
然后去:QuestionnaireRepo.FindAll().WithExpiryDate().WhereExpiredDateBeforeThanNow().SingleOrDefault();
你也可以说:
QuestionnaireRepo.FindAll(q => q.ExpiredDate != null && q.ExpiredDate <= DateTime.Now);
希望这会有所帮助......