Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / Extensions / UI / WebControls / Expressions / OrderByExpression.cs / 1305376 / OrderByExpression.cs
#if ORYX_VNEXT namespace Microsoft.Web.Data.UI.WebControls.Expressions { using System.Web; using System.Web.UI.WebControls; #else namespace System.Web.UI.WebControls.Expressions { #endif using System; using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Web.Resources; using System.Web.UI; [ PersistChildren(false), ParseChildren(true, "ThenByExpressions") ] public class OrderByExpression : DataSourceExpression { private const string OrderByMethod = "OrderBy"; private const string ThenByMethod = "ThenBy"; private const string OrderDescendingByMethod = "OrderByDescending"; private const string ThenDescendingByMethod = "ThenByDescending"; private Collection_thenByExpressions; public string DataField { get { return (string)ViewState["DataField"] ?? String.Empty; } set { ViewState["DataField"] = value; } } public SortDirection Direction { get { object o = ViewState["Direction"]; return o != null ? (SortDirection)o : SortDirection.Ascending; } set { ViewState["Direction"] = value; } } [PersistenceMode(PersistenceMode.InnerDefaultProperty)] public Collection ThenByExpressions { get { if (_thenByExpressions == null) { // _thenByExpressions = new Collection (); } return _thenByExpressions; } } public override IQueryable GetQueryable(IQueryable source) { if (source == null) { return null; } if (String.IsNullOrEmpty(DataField)) { throw new InvalidOperationException(AtlasWeb.Expressions_DataFieldRequired); } ParameterExpression pe = Expression.Parameter(source.ElementType, String.Empty); source = CreateSortQueryable(source, pe, Direction, DataField, false /* isThenBy */); foreach (ThenBy thenBy in ThenByExpressions) { source = CreateSortQueryable(source, pe, thenBy.Direction, thenBy.DataField, true /* isThenBy */); } return source; } private static IQueryable CreateSortQueryable(IQueryable source, ParameterExpression parameterExpression, SortDirection direction, string dataField, bool isThenBy) { string methodName = isThenBy ? GetThenBySortMethod(direction) : GetSortMethod(direction); Expression propertyExpression = ExpressionHelper.CreatePropertyExpression(parameterExpression, dataField); return source.Call(methodName, Expression.Lambda(propertyExpression, parameterExpression), source.ElementType, propertyExpression.Type); } private static string GetSortMethod(SortDirection direction) { switch (direction) { case SortDirection.Ascending: return OrderByMethod; case SortDirection.Descending: return OrderDescendingByMethod; default: Debug.Fail("shouldn't get here!"); return OrderByMethod; } } private static string GetThenBySortMethod(SortDirection direction) { switch (direction) { case SortDirection.Ascending: return ThenByMethod; case SortDirection.Descending: return ThenDescendingByMethod; default: Debug.Fail("shouldn't get here!"); return null; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. #if ORYX_VNEXT namespace Microsoft.Web.Data.UI.WebControls.Expressions { using System.Web; using System.Web.UI.WebControls; #else namespace System.Web.UI.WebControls.Expressions { #endif using System; using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Web.Resources; using System.Web.UI; [ PersistChildren(false), ParseChildren(true, "ThenByExpressions") ] public class OrderByExpression : DataSourceExpression { private const string OrderByMethod = "OrderBy"; private const string ThenByMethod = "ThenBy"; private const string OrderDescendingByMethod = "OrderByDescending"; private const string ThenDescendingByMethod = "ThenByDescending"; private Collection _thenByExpressions; public string DataField { get { return (string)ViewState["DataField"] ?? String.Empty; } set { ViewState["DataField"] = value; } } public SortDirection Direction { get { object o = ViewState["Direction"]; return o != null ? (SortDirection)o : SortDirection.Ascending; } set { ViewState["Direction"] = value; } } [PersistenceMode(PersistenceMode.InnerDefaultProperty)] public Collection ThenByExpressions { get { if (_thenByExpressions == null) { // _thenByExpressions = new Collection (); } return _thenByExpressions; } } public override IQueryable GetQueryable(IQueryable source) { if (source == null) { return null; } if (String.IsNullOrEmpty(DataField)) { throw new InvalidOperationException(AtlasWeb.Expressions_DataFieldRequired); } ParameterExpression pe = Expression.Parameter(source.ElementType, String.Empty); source = CreateSortQueryable(source, pe, Direction, DataField, false /* isThenBy */); foreach (ThenBy thenBy in ThenByExpressions) { source = CreateSortQueryable(source, pe, thenBy.Direction, thenBy.DataField, true /* isThenBy */); } return source; } private static IQueryable CreateSortQueryable(IQueryable source, ParameterExpression parameterExpression, SortDirection direction, string dataField, bool isThenBy) { string methodName = isThenBy ? GetThenBySortMethod(direction) : GetSortMethod(direction); Expression propertyExpression = ExpressionHelper.CreatePropertyExpression(parameterExpression, dataField); return source.Call(methodName, Expression.Lambda(propertyExpression, parameterExpression), source.ElementType, propertyExpression.Type); } private static string GetSortMethod(SortDirection direction) { switch (direction) { case SortDirection.Ascending: return OrderByMethod; case SortDirection.Descending: return OrderDescendingByMethod; default: Debug.Fail("shouldn't get here!"); return OrderByMethod; } } private static string GetThenBySortMethod(SortDirection direction) { switch (direction) { case SortDirection.Ascending: return ThenByMethod; case SortDirection.Descending: return ThenDescendingByMethod; default: Debug.Fail("shouldn't get here!"); return null; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- FormParameter.cs
- MexHttpsBindingElement.cs
- SafeFileMappingHandle.cs
- MultidimensionalArrayItemReference.cs
- SafeSecurityHandles.cs
- SelectionRange.cs
- ConfigurationElementProperty.cs
- HttpHandlerAction.cs
- EmptyElement.cs
- LinearGradientBrush.cs
- FontUnitConverter.cs
- TreeViewImageKeyConverter.cs
- XsdDateTime.cs
- HtmlWindowCollection.cs
- SoapMessage.cs
- CookielessHelper.cs
- SourceFileInfo.cs
- HyperLink.cs
- CacheForPrimitiveTypes.cs
- UInt16.cs
- Button.cs
- TypeDelegator.cs
- PropertySourceInfo.cs
- MetadataItemSerializer.cs
- SplitterPanelDesigner.cs
- ObjectList.cs
- PageBreakRecord.cs
- DataGridViewDataErrorEventArgs.cs
- ByteStreamMessageEncoderFactory.cs
- RsaSecurityTokenAuthenticator.cs
- ConfigXmlCDataSection.cs
- AsyncCompletedEventArgs.cs
- DropShadowBitmapEffect.cs
- CodeGroup.cs
- URLString.cs
- DiscoveryEndpoint.cs
- SerTrace.cs
- FontDifferentiator.cs
- IntPtr.cs
- CodeGenerator.cs
- ViewgenContext.cs
- ImageSource.cs
- XmlElement.cs
- ListBox.cs
- CoreChannel.cs
- ExpressionReplacer.cs
- DataGridViewDataConnection.cs
- AssemblyFilter.cs
- BooleanProjectedSlot.cs
- EnumDataContract.cs
- Crypto.cs
- StoreAnnotationsMap.cs
- XmlWrappingReader.cs
- TraceUtility.cs
- RTLAwareMessageBox.cs
- DataTableMapping.cs
- EventSinkHelperWriter.cs
- SerializerWriterEventHandlers.cs
- AdvancedBindingEditor.cs
- PrivilegedConfigurationManager.cs
- DispatchChannelSink.cs
- CodeDomSerializationProvider.cs
- NumberSubstitution.cs
- KernelTypeValidation.cs
- TemplateKeyConverter.cs
- FormatterConverter.cs
- EventLogPermissionEntryCollection.cs
- Selection.cs
- ShaderRenderModeValidation.cs
- WrappedKeySecurityTokenParameters.cs
- AsyncInvokeOperation.cs
- RealizedColumnsBlock.cs
- ListViewAutomationPeer.cs
- HttpContextBase.cs
- ProxyElement.cs
- GridPatternIdentifiers.cs
- NativeMethods.cs
- GeneralTransform.cs
- Nodes.cs
- SmtpLoginAuthenticationModule.cs
- NullExtension.cs
- SizeFConverter.cs
- ExtendedProperty.cs
- FileChangesMonitor.cs
- CompilerScopeManager.cs
- XmlSignificantWhitespace.cs
- Timer.cs
- XmlNode.cs
- ListViewDeleteEventArgs.cs
- MaterialCollection.cs
- FormViewModeEventArgs.cs
- IChannel.cs
- GlobalizationSection.cs
- RecommendedAsConfigurableAttribute.cs
- BamlLocalizabilityResolver.cs
- Polygon.cs
- SystemIdentity.cs
- PostBackOptions.cs
- InkPresenter.cs
- GeometryCombineModeValidation.cs