Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DataWebControls / System / Data / WebControls / OrderByBuilder.cs / 1 / OrderByBuilder.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using System.Data.Metadata.Edm;
using System.Diagnostics;
using System.Collections.Specialized;
using System.Collections;
namespace System.Web.UI.WebControls
{
internal class OrderByBuilder
{
private readonly string _argsSortExpression;
private readonly EntityDataSourceWrapperCollection _wrapperCollection;
private readonly string _orderBy;
private readonly bool _autoGenerateOrderByClause;
private readonly ParameterCollection _orderByParameters;
private readonly EntityDataSource _owner;
private readonly bool _generateDefaultOrderByClause;
internal OrderByBuilder(string argsSortExpression,
EntityDataSourceWrapperCollection wrapperCollection,
string orderBy,
bool autoGenerateOrderByClause,
ParameterCollection orderByParameters,
bool generateDefaultOrderByClause,
EntityDataSource owner)
{
_argsSortExpression = argsSortExpression;
_wrapperCollection = wrapperCollection;
_orderBy = orderBy;
_autoGenerateOrderByClause = autoGenerateOrderByClause;
_orderByParameters = orderByParameters;
_owner = owner;
_generateDefaultOrderByClause = generateDefaultOrderByClause;
}
internal void Generate(TypeUsage tu, out string orderBy, out ObjectParameter[] orderByParameters)
{
Debug.Assert(null != tu, "Type Usage cannot be null");
GenerateOrderByClause(tu, out orderBy, out orderByParameters);
}
private void GenerateOrderByClause(TypeUsage tu, out string orderByClause, out ObjectParameter[] orderByObjectParameters)
{
StringBuilder orderByClauseBuilder = new StringBuilder();
// This sets the orderBy clause based on a clicked column header in the databound control.
AppendOrderByKey(orderByClauseBuilder, _argsSortExpression, Strings.EntityDataSourceView_ColumnHeader, tu);
// AutoGenerateOrderByClause is mutually exclusive with OrderBy.
// Only one of the following two if statements will execute.
if (_autoGenerateOrderByClause)
{
Debug.Assert(String.IsNullOrEmpty(_orderBy), "If AutoGenerateOrderByClause is true, then OrderBy cannot be set. This should have been caught by a runtime error check");
IOrderedDictionary paramValues = _orderByParameters.GetValues(_owner.HttpContext, _owner);
foreach (DictionaryEntry de in paramValues)
{
// Skip AutoGenerateOrderBy on expressions that have a null value.
if (!string.IsNullOrEmpty((string)(de.Value)))
{
if (0 < orderByClauseBuilder.Length)
{
orderByClauseBuilder.Append(", ");
}
AppendOrderByKey(orderByClauseBuilder, (string)(de.Value), Strings.EntityDataSourceView_AutoGenerateOrderByParameters, tu);
}
}
}
// Append the OrderBy expression, if it's nonzero length.
//
if (!String.IsNullOrEmpty(_orderBy))
{
orderByObjectParameters = _owner.GetOrderByParameters();
Debug.Assert(!_autoGenerateOrderByClause, "If OrderBy is set, AutoGenerateOrderBy must be false. This should have been caught by a runtime error check");
if (0 < orderByClauseBuilder.Length)
{
orderByClauseBuilder.Append(", ");
}
orderByClauseBuilder.Append(_orderBy);
}
else
{
orderByObjectParameters = new ObjectParameter[] { };
}
if (orderByClauseBuilder.Length==0 && _generateDefaultOrderByClause)
{
// This only occurs if there's no EntitySet, which means entities are not wrapped.
orderByClauseBuilder.Append(GenerateDefaultOrderByFromTypeUsage(tu));
}
orderByClause = orderByClauseBuilder.ToString();
}
private void AppendOrderByKey(StringBuilder orderByClauseBuilder, string expression, string errorText, TypeUsage tu)
{
if (!String.IsNullOrEmpty(expression))
{
const string ascTail = " ASC";
const string descTail = " DESC";
string tail = String.Empty;
string columnName = expression;
if (expression.EndsWith(ascTail, StringComparison.OrdinalIgnoreCase))
{
tail = ascTail;
columnName = expression.Substring(0, expression.Length - 4);
}
else if (expression.EndsWith(descTail, StringComparison.OrdinalIgnoreCase))
{
tail = descTail;
columnName = expression.Substring(0, expression.Length - 5);
}
if (EntityDataSourceUtil.PropertyIsOnEntity(columnName, _wrapperCollection, null, tu))
{
orderByClauseBuilder.Append(EntityDataSourceUtil.GetEntitySqlValueForColumnName(columnName, _wrapperCollection));
orderByClauseBuilder.Append(tail);
}
else // pass the sort expression through verbatim.
{
orderByClauseBuilder.Append(expression);
}
}
}
private static string GenerateDefaultOrderByFromTypeUsage(TypeUsage tu)
{
StringBuilder orderByBuilder = new StringBuilder();
ReadOnlyMetadataCollection propertyCollection;
List keyMemberNames = null;
EntityType entityType = tu.EdmType as EntityType;
if (null != entityType)
{
ReadOnlyMetadataCollection keyMembers;
keyMembers = entityType.KeyMembers;
keyMemberNames = new List(entityType.KeyMembers.Count);
propertyCollection = entityType.Properties;
foreach (EdmMember edmMember in keyMembers)
{
keyMemberNames.Add(edmMember.Name);
}
}
else
{
return String.Empty;
}
foreach (EdmProperty property in propertyCollection)
{
if (keyMemberNames.Contains(property.Name) &&
property.TypeUsage.EdmType.BuiltInTypeKind == BuiltInTypeKind.PrimitiveType)
{
if (0 < orderByBuilder.Length)
{
orderByBuilder.Append(", ");
}
orderByBuilder.Append(EntityDataSourceUtil.EntitySqlElementAlias);
orderByBuilder.Append(".");
orderByBuilder.Append(EntityDataSourceUtil.QuoteEntitySqlIdentifier(property.Name));
}
}
return orderByBuilder.ToString();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using System.Data.Metadata.Edm;
using System.Diagnostics;
using System.Collections.Specialized;
using System.Collections;
namespace System.Web.UI.WebControls
{
internal class OrderByBuilder
{
private readonly string _argsSortExpression;
private readonly EntityDataSourceWrapperCollection _wrapperCollection;
private readonly string _orderBy;
private readonly bool _autoGenerateOrderByClause;
private readonly ParameterCollection _orderByParameters;
private readonly EntityDataSource _owner;
private readonly bool _generateDefaultOrderByClause;
internal OrderByBuilder(string argsSortExpression,
EntityDataSourceWrapperCollection wrapperCollection,
string orderBy,
bool autoGenerateOrderByClause,
ParameterCollection orderByParameters,
bool generateDefaultOrderByClause,
EntityDataSource owner)
{
_argsSortExpression = argsSortExpression;
_wrapperCollection = wrapperCollection;
_orderBy = orderBy;
_autoGenerateOrderByClause = autoGenerateOrderByClause;
_orderByParameters = orderByParameters;
_owner = owner;
_generateDefaultOrderByClause = generateDefaultOrderByClause;
}
internal void Generate(TypeUsage tu, out string orderBy, out ObjectParameter[] orderByParameters)
{
Debug.Assert(null != tu, "Type Usage cannot be null");
GenerateOrderByClause(tu, out orderBy, out orderByParameters);
}
private void GenerateOrderByClause(TypeUsage tu, out string orderByClause, out ObjectParameter[] orderByObjectParameters)
{
StringBuilder orderByClauseBuilder = new StringBuilder();
// This sets the orderBy clause based on a clicked column header in the databound control.
AppendOrderByKey(orderByClauseBuilder, _argsSortExpression, Strings.EntityDataSourceView_ColumnHeader, tu);
// AutoGenerateOrderByClause is mutually exclusive with OrderBy.
// Only one of the following two if statements will execute.
if (_autoGenerateOrderByClause)
{
Debug.Assert(String.IsNullOrEmpty(_orderBy), "If AutoGenerateOrderByClause is true, then OrderBy cannot be set. This should have been caught by a runtime error check");
IOrderedDictionary paramValues = _orderByParameters.GetValues(_owner.HttpContext, _owner);
foreach (DictionaryEntry de in paramValues)
{
// Skip AutoGenerateOrderBy on expressions that have a null value.
if (!string.IsNullOrEmpty((string)(de.Value)))
{
if (0 < orderByClauseBuilder.Length)
{
orderByClauseBuilder.Append(", ");
}
AppendOrderByKey(orderByClauseBuilder, (string)(de.Value), Strings.EntityDataSourceView_AutoGenerateOrderByParameters, tu);
}
}
}
// Append the OrderBy expression, if it's nonzero length.
//
if (!String.IsNullOrEmpty(_orderBy))
{
orderByObjectParameters = _owner.GetOrderByParameters();
Debug.Assert(!_autoGenerateOrderByClause, "If OrderBy is set, AutoGenerateOrderBy must be false. This should have been caught by a runtime error check");
if (0 < orderByClauseBuilder.Length)
{
orderByClauseBuilder.Append(", ");
}
orderByClauseBuilder.Append(_orderBy);
}
else
{
orderByObjectParameters = new ObjectParameter[] { };
}
if (orderByClauseBuilder.Length==0 && _generateDefaultOrderByClause)
{
// This only occurs if there's no EntitySet, which means entities are not wrapped.
orderByClauseBuilder.Append(GenerateDefaultOrderByFromTypeUsage(tu));
}
orderByClause = orderByClauseBuilder.ToString();
}
private void AppendOrderByKey(StringBuilder orderByClauseBuilder, string expression, string errorText, TypeUsage tu)
{
if (!String.IsNullOrEmpty(expression))
{
const string ascTail = " ASC";
const string descTail = " DESC";
string tail = String.Empty;
string columnName = expression;
if (expression.EndsWith(ascTail, StringComparison.OrdinalIgnoreCase))
{
tail = ascTail;
columnName = expression.Substring(0, expression.Length - 4);
}
else if (expression.EndsWith(descTail, StringComparison.OrdinalIgnoreCase))
{
tail = descTail;
columnName = expression.Substring(0, expression.Length - 5);
}
if (EntityDataSourceUtil.PropertyIsOnEntity(columnName, _wrapperCollection, null, tu))
{
orderByClauseBuilder.Append(EntityDataSourceUtil.GetEntitySqlValueForColumnName(columnName, _wrapperCollection));
orderByClauseBuilder.Append(tail);
}
else // pass the sort expression through verbatim.
{
orderByClauseBuilder.Append(expression);
}
}
}
private static string GenerateDefaultOrderByFromTypeUsage(TypeUsage tu)
{
StringBuilder orderByBuilder = new StringBuilder();
ReadOnlyMetadataCollection propertyCollection;
List keyMemberNames = null;
EntityType entityType = tu.EdmType as EntityType;
if (null != entityType)
{
ReadOnlyMetadataCollection keyMembers;
keyMembers = entityType.KeyMembers;
keyMemberNames = new List(entityType.KeyMembers.Count);
propertyCollection = entityType.Properties;
foreach (EdmMember edmMember in keyMembers)
{
keyMemberNames.Add(edmMember.Name);
}
}
else
{
return String.Empty;
}
foreach (EdmProperty property in propertyCollection)
{
if (keyMemberNames.Contains(property.Name) &&
property.TypeUsage.EdmType.BuiltInTypeKind == BuiltInTypeKind.PrimitiveType)
{
if (0 < orderByBuilder.Length)
{
orderByBuilder.Append(", ");
}
orderByBuilder.Append(EntityDataSourceUtil.EntitySqlElementAlias);
orderByBuilder.Append(".");
orderByBuilder.Append(EntityDataSourceUtil.QuoteEntitySqlIdentifier(property.Name));
}
}
return orderByBuilder.ToString();
}
}
}
// 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
- DataGridViewRowsAddedEventArgs.cs
- MinimizableAttributeTypeConverter.cs
- DataSourceIDConverter.cs
- Converter.cs
- ByeMessage11.cs
- FunctionMappingTranslator.cs
- KeyConstraint.cs
- StylusCollection.cs
- LinqDataSourceInsertEventArgs.cs
- FixedSOMLineCollection.cs
- ISAPIWorkerRequest.cs
- InputScopeConverter.cs
- WindowsListViewGroupHelper.cs
- webbrowsersite.cs
- BeginEvent.cs
- LayoutTableCell.cs
- HtmlInputSubmit.cs
- InterleavedZipPartStream.cs
- RoutedEventArgs.cs
- TraceSwitch.cs
- BackgroundWorker.cs
- TypeUnloadedException.cs
- ItemsPresenter.cs
- RemoteHelper.cs
- LicenseProviderAttribute.cs
- TransformedBitmap.cs
- ReservationCollection.cs
- __ConsoleStream.cs
- MediaPlayerState.cs
- VisualStyleRenderer.cs
- ImageCodecInfoPrivate.cs
- PropertyReference.cs
- ControlCommandSet.cs
- NullableIntMinMaxAggregationOperator.cs
- SQLRoleProvider.cs
- Int32Storage.cs
- SingleObjectCollection.cs
- RedirectionProxy.cs
- Encoding.cs
- ToolStripDropDownItemDesigner.cs
- CallId.cs
- CodeNamespace.cs
- XmlNamespaceMappingCollection.cs
- WsiProfilesElement.cs
- ConvertEvent.cs
- CultureMapper.cs
- LinqDataSourceInsertEventArgs.cs
- RegisteredDisposeScript.cs
- InvalidPropValue.cs
- IISUnsafeMethods.cs
- TrackingSection.cs
- CompilationRelaxations.cs
- ProtocolsConfiguration.cs
- FileAuthorizationModule.cs
- Matrix3D.cs
- CachedPathData.cs
- ThrowHelper.cs
- DeploymentSection.cs
- AppDomainFactory.cs
- LostFocusEventManager.cs
- TextBox.cs
- TemplateField.cs
- Facet.cs
- ListView.cs
- DataGridViewElement.cs
- ConnectionConsumerAttribute.cs
- ListDictionaryInternal.cs
- AuthenticationModulesSection.cs
- RemoteWebConfigurationHostServer.cs
- DocumentApplicationJournalEntry.cs
- TextSegment.cs
- ViewKeyConstraint.cs
- InkCollectionBehavior.cs
- PrePrepareMethodAttribute.cs
- Processor.cs
- BamlLocalizationDictionary.cs
- StreamingContext.cs
- SpellerError.cs
- ProtectedConfigurationSection.cs
- BitmapImage.cs
- DataPagerFieldCommandEventArgs.cs
- NamedElement.cs
- BinHexDecoder.cs
- compensatingcollection.cs
- PerformanceCounterManager.cs
- CompiledQueryCacheKey.cs
- FileSecurity.cs
- SqlEnums.cs
- InputLangChangeEvent.cs
- TreeNodeCollectionEditor.cs
- MappingModelBuildProvider.cs
- WindowsBrush.cs
- DateBoldEvent.cs
- SoapHeaders.cs
- ShaperBuffers.cs
- AlternationConverter.cs
- SHA1CryptoServiceProvider.cs
- X509ClientCertificateAuthentication.cs
- BitmapEffect.cs
- DispatcherSynchronizationContext.cs