コード例 #1
0
        ///<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);
        }