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
- CssClassPropertyAttribute.cs
- ForwardPositionQuery.cs
- ScrollItemPatternIdentifiers.cs
- HyperLinkStyle.cs
- Subtree.cs
- StyleCollection.cs
- ScrollableControlDesigner.cs
- TextShapeableCharacters.cs
- XamlBuildProvider.cs
- RelatedView.cs
- TypeSource.cs
- WebPartManagerInternals.cs
- TemplatePartAttribute.cs
- FunctionCommandText.cs
- ParserHooks.cs
- View.cs
- JsonReaderWriterFactory.cs
- TextServicesContext.cs
- PolicyUnit.cs
- ControlBindingsConverter.cs
- PersonalizationProvider.cs
- PersonalizationDictionary.cs
- ToolStripSystemRenderer.cs
- MailSettingsSection.cs
- LinkConverter.cs
- SeverityFilter.cs
- ScaleTransform3D.cs
- MessagingDescriptionAttribute.cs
- HtmlControlPersistable.cs
- ForeignConstraint.cs
- BuildProviderCollection.cs
- Base64Decoder.cs
- coordinator.cs
- InternalConfigRoot.cs
- ImportCatalogPart.cs
- CuspData.cs
- PageBuildProvider.cs
- WorkflowOwnershipException.cs
- FrameworkElementFactoryMarkupObject.cs
- ClientFormsIdentity.cs
- XamlFilter.cs
- TargetInvocationException.cs
- Command.cs
- CodeExpressionStatement.cs
- PanelStyle.cs
- XmlNodeComparer.cs
- DesignerVerbCollection.cs
- StringInfo.cs
- String.cs
- IInstanceTable.cs
- XmlChildNodes.cs
- TileModeValidation.cs
- DocumentGrid.cs
- PhoneCall.cs
- XsltArgumentList.cs
- CodeTypeConstructor.cs
- EndGetFileNameFromUserRequest.cs
- SafeUserTokenHandle.cs
- XmlEnumAttribute.cs
- CustomGrammar.cs
- BookmarkScope.cs
- ItemsChangedEventArgs.cs
- PrefixQName.cs
- SQLInt64Storage.cs
- ImageAutomationPeer.cs
- TextAnchor.cs
- RadialGradientBrush.cs
- WindowsRegion.cs
- clipboard.cs
- ExternalCalls.cs
- XmlAttributes.cs
- SessionStateContainer.cs
- ScrollBar.cs
- FlagsAttribute.cs
- DbProviderServices.cs
- WorkflowMarkupSerializationException.cs
- SimpleTableProvider.cs
- SqlRowUpdatedEvent.cs
- Switch.cs
- DataGridViewTextBoxCell.cs
- DocumentCollection.cs
- FormViewRow.cs
- BreakSafeBase.cs
- QueryComponents.cs
- Imaging.cs
- Point4D.cs
- Focus.cs
- IteratorFilter.cs
- AesCryptoServiceProvider.cs
- InfoCardRSAOAEPKeyExchangeFormatter.cs
- AvTraceFormat.cs
- SqlDuplicator.cs
- _ProxyChain.cs
- TextLine.cs
- SafeNativeMethods.cs
- CodeAccessPermission.cs
- CodeValidator.cs
- TypeForwardedToAttribute.cs
- JoinGraph.cs
- CodeIdentifiers.cs