///<summary> ///INPUT : /// nullableDateExp : product => product.Date /// filter.ComparatorType : Equal /// EXPRESSION GÉNÉRÉE : /// /// product => product.Date != null // on check que les dates non nulles /// && ( /// ( /// source.DateType == DateType.Date // si le type est Day : on applique .Day sur les dates /// && (Date)(object)product.Date.Value.Date // (Date)(object) pour caster les champs en SmallDate /// == source.Date.Date // on compare avec la valeur du filtre /// ) || ( /// source.DateType != DateType.Day // si le type n'est pas Day : on prend directement les dates /// && (Date)(object)product.EndDate.Value // (Date)(object) pour caster les champs en SmallDate /// == source.Date // on compare avec la valeur du filtre /// ) /// ) /// /// </summary> /// <example> /// IQueryable<BillingProductEntity> filterQueryByEndDate(IQueryable<BillingProductEntity> query, ComparableDate source) /// { /// // (BillingProductEntity product) => product.EndDate /// var inputExp = Expression.Parameter(typeof(BillingProductEntity)); /// Expression getDateExp = Expression.Property(inputExp, nameof(BillingProductEntity.EndDate)); /// /// // filtre /// Expression checkDateExp = IsValidExp(getDateExp, source); /// var lambda = Expression.Lambda<Func<BillingProductEntity, bool>>(checkDateExp, new[] { inputExp }); /// return query.Where(lambda); /// } /// </example> /// <param name="nullableDateExp">expression pour récupérer une date</param> public static BinaryExpression GetComparisonExpression(this ComparableDate filter, Expression nullableDateExp) { ThrowIfArgumentIsNull(filter); // (Date)(object)product.Date.Value Expression getDateExp = GetValidDate(nullableDateExp); getDateExp = ApplyDateType(filter.DateType, getDateExp); // source.Date Expression getFilterExp = Expression.Constant(filter.Date); getFilterExp = ApplyDateType(filter.DateType, getFilterExp); // date == filter Expression applyOperatorExp = ComparisonHelper.ApplyCompareOperation(filter.ComparatorType, getDateExp, getFilterExp); // product.Date != null && BinaryExpression checkExp = ApplyNullCheck(nullableDateExp, applyOperatorExp); return(checkExp); }