You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			145 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| namespace System.Web.UI.WebControls.Expressions {
 | |
|     using System;
 | |
|     using System.Collections;
 | |
|     using System.Collections.Generic;
 | |
|     using System.Collections.Specialized;
 | |
|     using System.ComponentModel;
 | |
|     using System.Diagnostics;
 | |
|     using System.Linq;
 | |
|     using System.Linq.Expressions;
 | |
|     using System.Web.Resources;
 | |
|     using System.Web.UI;
 | |
|     using System.Web.UI.WebControls;
 | |
|     
 | |
|     public class RangeExpression : ParameterDataSourceExpression {
 | |
|         public string DataField {
 | |
|             get {
 | |
|                 return (string)ViewState["DataField"] ?? String.Empty;
 | |
|             }
 | |
|             set {
 | |
|                 ViewState["DataField"] = value;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public RangeType MinType {
 | |
|             get {
 | |
|                 object o = ViewState["MinType"];
 | |
|                 return o != null ? (RangeType)o : RangeType.None;
 | |
|             }
 | |
|             set {
 | |
|                 ViewState["MinType"] = value;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public RangeType MaxType {
 | |
|             get {
 | |
|                 object o = ViewState["MaxType"];
 | |
|                 return o != null ? (RangeType)o : RangeType.None;
 | |
|             }
 | |
|             set {
 | |
|                 ViewState["MaxType"] = value;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         internal virtual new IOrderedDictionary GetValues() {
 | |
|             return Parameters.GetValues(Context, Owner);
 | |
|         }
 | |
| 
 | |
|         public override IQueryable GetQueryable(IQueryable source) {
 | |
|             if (source == null) {
 | |
|                 return null;
 | |
|             }
 | |
| 
 | |
|             if (String.IsNullOrEmpty(DataField)) {
 | |
|                 throw new InvalidOperationException(AtlasWeb.Expressions_DataFieldRequired);
 | |
|             }
 | |
| 
 | |
|             IOrderedDictionary values = GetValues();
 | |
|             ParameterExpression parameterExpression = Expression.Parameter(source.ElementType, String.Empty);
 | |
|             Expression properyExpression = ExpressionHelper.GetValue(ExpressionHelper.CreatePropertyExpression(parameterExpression, DataField));
 | |
| 
 | |
|             if (MinType == RangeType.None && MaxType == RangeType.None) {
 | |
|                 throw new InvalidOperationException(AtlasWeb.RangeExpression_RangeTypeMustBeSpecified);
 | |
|             }
 | |
| 
 | |
|             Expression minExpression = null;
 | |
|             Expression maxExpression = null;
 | |
| 
 | |
|             if (MinType != RangeType.None) {
 | |
|                 if (values.Count == 0) {
 | |
|                     throw new InvalidOperationException(AtlasWeb.RangeExpression_MinimumValueRequired);
 | |
|                 }
 | |
| 
 | |
|                 if (values[0] != null) {
 | |
|                     minExpression = GetMinRangeExpression(properyExpression, values[0], MinType);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (MaxType != RangeType.None) {
 | |
|                 if (values.Count == 0  || ((minExpression != null) && (values.Count == 1))) {
 | |
|                     throw new InvalidOperationException(AtlasWeb.RangeExpression_MaximumValueRequired);
 | |
|                 }
 | |
| 
 | |
|                 object maxValue = minExpression == null ? values[0] : values[1];
 | |
|                 if (maxValue != null) {
 | |
|                     maxExpression = GetMaxRangeExpression(properyExpression, maxValue, MaxType);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if ((maxExpression == null) && (minExpression == null)) {
 | |
|                 return null;
 | |
|             }
 | |
| 
 | |
|             Expression rangeExpression = CreateRangeExpressionBody(minExpression, maxExpression);
 | |
| 
 | |
|             return ExpressionHelper.Where(source, Expression.Lambda(rangeExpression, parameterExpression));
 | |
|         }
 | |
| 
 | |
|         private static Expression GetMinRangeExpression(Expression propertyExpression, object value, RangeType rangeType) {
 | |
|             ConstantExpression constantValue = Expression.Constant(ExpressionHelper.BuildObjectValue(value, propertyExpression.Type));
 | |
|             switch (rangeType) {
 | |
|                 case RangeType.Exclusive:
 | |
|                     return Expression.GreaterThan(propertyExpression, constantValue);
 | |
|                 case RangeType.None:
 | |
|                     return null;
 | |
|                 case RangeType.Inclusive:
 | |
|                     return Expression.GreaterThanOrEqual(propertyExpression, constantValue);
 | |
|                 default:
 | |
|                     Debug.Fail("shouldn't get here!");
 | |
|                     return null;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static Expression GetMaxRangeExpression(Expression propertyExpression, object value, RangeType rangeType) {
 | |
|             ConstantExpression constantValue = Expression.Constant(ExpressionHelper.BuildObjectValue(value, propertyExpression.Type));
 | |
|             switch (rangeType) {
 | |
|                 case RangeType.Exclusive:
 | |
|                     return Expression.LessThan(propertyExpression, constantValue);
 | |
|                 case RangeType.None:
 | |
|                     return null;
 | |
|                 case RangeType.Inclusive:
 | |
|                     return Expression.LessThanOrEqual(propertyExpression, constantValue);
 | |
|                 default:
 | |
|                     Debug.Fail("shouldn't get here!");
 | |
|                     return null;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static Expression CreateRangeExpressionBody(Expression minExpression, Expression maxExpression) {
 | |
|             if (minExpression == null && maxExpression == null) {
 | |
|                 return null;
 | |
|             }
 | |
| 
 | |
|             if (minExpression == null) {
 | |
|                 return maxExpression;
 | |
|             }
 | |
| 
 | |
|             if (maxExpression == null) {
 | |
|                 return minExpression;
 | |
|             }
 | |
| 
 | |
|             return Expression.AndAlso(minExpression, maxExpression);
 | |
|         }
 | |
|     }
 | |
| }
 |