代码之家  ›  专栏  ›  技术社区  ›  Andrew

多条件空检查的linq where子句

  •  7
  • Andrew  · 技术社区  · 16 年前

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

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

    我需要第二次检查,只有第一次是真的。我使用一个单一的存储库模式,findall接受了where子句

    有什么想法吗?这里有很多类似的问题,但没有给出答案,我对linq很陌生,正如你可能猜到的:)

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

    3 回复  |  直到 16 年前
        1
  •  8
  •   LukeH    16 年前

    这不管用吗?

    QuestionnaireRepo.FindAll(
        q => (q.ExpiredDate == null) || (q.ExpiredDate > DateTime.Now));
    
        2
  •  2
  •   willbt    16 年前

    如果这是linq to sql或linq to entities,那么hasvalue将不会转换为sql表达式,您将得到一个异常。

    这样就可以了。

    QuestionnaireRepo.FindAll(q => q.ExpiredDate != null && q.ExpiredDate <= DateTime.Now)
    
        3
  •  1
  •   Richard    16 年前

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

    使用管道和过滤器模式,可以执行以下操作:

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

    希望这有帮助…