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
- XmlSchemaSimpleContentExtension.cs
- LinqDataSource.cs
- connectionpool.cs
- SpeakInfo.cs
- InternalResources.cs
- ProfilePropertySettingsCollection.cs
- UnionCodeGroup.cs
- Baml6Assembly.cs
- OutputCacheModule.cs
- ObjectViewFactory.cs
- Size3DValueSerializer.cs
- XsdDateTime.cs
- WebPartMenu.cs
- StylusCollection.cs
- LookupNode.cs
- CqlQuery.cs
- TripleDES.cs
- BindingNavigator.cs
- ColorBuilder.cs
- SafeReversePInvokeHandle.cs
- DictionaryManager.cs
- SafeFileMapViewHandle.cs
- HtmlButton.cs
- WorkflowTransactionService.cs
- DataServicePagingProviderWrapper.cs
- baseaxisquery.cs
- WsatConfiguration.cs
- DataSourceHelper.cs
- recordstate.cs
- XmlSchemaInferenceException.cs
- EncryptedXml.cs
- PersonalizablePropertyEntry.cs
- CheckBoxRenderer.cs
- ActivityExecutionWorkItem.cs
- UIntPtr.cs
- CapabilitiesUse.cs
- HGlobalSafeHandle.cs
- StrokeNodeOperations2.cs
- SystemIPAddressInformation.cs
- Vector3DAnimationUsingKeyFrames.cs
- TaskSchedulerException.cs
- TagNameToTypeMapper.cs
- KeyNotFoundException.cs
- formatter.cs
- GridViewUpdateEventArgs.cs
- PropertyDescriptorComparer.cs
- Pkcs7Recipient.cs
- Popup.cs
- CategoryAttribute.cs
- SelectionPatternIdentifiers.cs
- OutOfProcStateClientManager.cs
- WindowsToolbarItemAsMenuItem.cs
- ObfuscationAttribute.cs
- TypeBuilder.cs
- securestring.cs
- DynamicContractTypeBuilder.cs
- RIPEMD160Managed.cs
- TableItemPattern.cs
- PrivateFontCollection.cs
- Control.cs
- RequestQueue.cs
- EntityContainerEmitter.cs
- RecognizeCompletedEventArgs.cs
- ChainedAsyncResult.cs
- TransferMode.cs
- CodeRegionDirective.cs
- SettingsAttributeDictionary.cs
- FilteredAttributeCollection.cs
- HtmlControlPersistable.cs
- ServicePoint.cs
- LocalValueEnumerator.cs
- X509Utils.cs
- KeyManager.cs
- UpdateTranslator.cs
- ServicePoint.cs
- EraserBehavior.cs
- NativeMethods.cs
- ListViewItem.cs
- FSWPathEditor.cs
- SqlXmlStorage.cs
- SymbolMethod.cs
- ArrangedElementCollection.cs
- OracleBoolean.cs
- LoginViewDesigner.cs
- CompoundFileDeflateTransform.cs
- followingquery.cs
- SystemInformation.cs
- FormViewDesigner.cs
- AuthorizationRule.cs
- Int32Rect.cs
- SoapHeaderAttribute.cs
- RectangleF.cs
- CompilerErrorCollection.cs
- HtmlTernaryTree.cs
- StateChangeEvent.cs
- PerformanceCounterCategory.cs
- HtmlButton.cs
- XmlDataProvider.cs
- GlobalItem.cs
- AutomationFocusChangedEventArgs.cs