7

我正在尝试检查 linq 中的日期是否为空,以及是否未检查其未来日期。

QuestionnaireRepo.FindAll(q => !q.ExpiredDate.HasValue || q.ExpiredDate >DateTime.Now).OrderByDescending(order => order.CreatedDate);

我需要第二次检查仅在第一次为真时才适用。我正在使用单个存储库模式,并且 FindAll 接受了 where 子句

有任何想法吗?这里有很多类似的问题,但没有给出答案,我对 Linq 很陌生,你可能已经猜到了 :)

编辑:我得到了我现在需要的结果,但在某些情况下它将检查 > 以空值为条件。这不是一件坏事吗?

4

3 回答 3

8

这行不通吗?

QuestionnaireRepo.FindAll(
    q => (q.ExpiredDate == null) || (q.ExpiredDate > DateTime.Now));
于 2010-03-17T16:48:17.803 回答
2

如果这是 Linq-to-Sql 或 Linq-To-Entities,则 HasValue 不会转换为 SQL 表达式,您将得到异常。

这应该这样做。

QuestionnaireRepo.FindAll(q => q.ExpiredDate != null && q.ExpiredDate <= DateTime.Now)
于 2010-03-17T16:49:38.393 回答
1

有几种方法可以做到这一点,一种很好的方法是使用管道和过滤器,但是看看你是如何实现上述的,看起来你并没有使用这种模式,所以不会进入它,但它值得谷歌搜索。

使用管道和过滤器模式,您可以这样做:

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

希望这可以帮助...

于 2010-03-17T16:49:41.020 回答