Linq where子句具有多个条件和null检查

时间:2010-03-17 16:43:46

标签: linq where-clause

我正在尝试检查linq中的日期是否为空,如果没有检查它的未来日期。

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

我需要第二张支票才能申请,如果第一张是真的。我使用单个存储库模式,FindAll接受了where子句

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

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

3 个答案:

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

希望这会有所帮助......