Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWebControls / System / Data / WebControls / EntityDataSourceQueryBuilder.cs / 1305376 / EntityDataSourceQueryBuilder.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.Data;
using System.Data.Common;
using System.Collections.Generic;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data.Entity;
using System.Data.Metadata.Edm;
using System.Data.Objects;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Web.DynamicData;
using System.Web.UI;
using System.Linq.Expressions;
namespace System.Web.UI.WebControls
{
internal abstract class EntityDataSourceQueryBuilder
{
private readonly DataSourceSelectArguments _arguments;
private readonly string _commandText;
private readonly ObjectParameter[] _commandParameters;
private readonly string _whereExpression;
private readonly ObjectParameter[] _whereParameters;
private readonly string _entitySetQueryExpression;
private readonly OrderByBuilder _orderByBuilder;
private string _includePaths;
private TypeUsage _resultType;
private Nullable _count;
protected EntityDataSourceQueryBuilder(DataSourceSelectArguments arguments,
string commandText, ObjectParameter[] commandParameters,
string whereExpression, ObjectParameter[] whereParameters, string entitySetQueryExpression,
string selectExpression, string groupByExpression, ObjectParameter[] selectParameters,
OrderByBuilder orderByBuilder,
string includePaths)
{
_arguments = arguments;
_commandText = commandText;
_commandParameters = commandParameters;
_whereExpression = whereExpression;
_whereParameters = whereParameters;
_entitySetQueryExpression = entitySetQueryExpression;
_orderByBuilder = orderByBuilder;
_includePaths = includePaths;
}
internal delegate EntityDataSourceQueryBuilder Creator(DataSourceSelectArguments arguments,
string commandText, ObjectParameter[] commandParameters,
string whereExpression, ObjectParameter[] whereParameters, string entitySetQueryExpression,
string selectExpression, string groupByExpression, ObjectParameter[] selectParameters,
OrderByBuilder orderByBuilder,
string includePaths);
internal TypeUsage ResultType
{
get
{
Debug.Assert(_resultType != null, "ResultType is only valid after Build()");
return _resultType;
}
}
internal int TotalCount
{
get
{
Debug.Assert(_count.HasValue, "Count is not valid until after Build. And only then if computeCount is true");
return _count.Value;
}
}
internal IEnumerable Execute(ObjectQuery queryT)
{
return (IEnumerable)(((IListSource)(queryT)).GetList());
}
internal ObjectQuery BuildBasicQuery(ObjectContext context, bool computeCount)
{
ObjectQuery queryT = QueryBuilderUtils.ConstructQuery(context, _entitySetQueryExpression, _commandText, _commandParameters);
queryT = ApplyWhere(queryT);
queryT = ApplySelect(queryT); // Select and/or GroupBy application
_resultType = queryT.GetResultType();
return queryT;
}
internal ObjectQuery CompleteBuild(ObjectQuery queryT, ObjectContext context, bool computeCount, bool wasExtended)
{
if (computeCount)
{
_count = queryT.Count();
}
queryT = wasExtended ? ApplyQueryableOrderByAndPaging(queryT) : ApplyOrderByAndPaging(queryT);
queryT = ApplyIncludePaths(queryT);
return queryT;
}
private ObjectQuery ApplyWhere(ObjectQuery queryT)
{
if (!String.IsNullOrEmpty(_whereExpression))
{
queryT = queryT.Where(_whereExpression, _whereParameters);
}
return queryT;
}
protected abstract ObjectQuery ApplySelect(ObjectQuery queryT);
internal ObjectQuery ApplyOrderBy(ObjectQuery queryT)
{
string orderByClause;
ObjectParameter[] orderByParameters;
// Apply all possible ordering except the sort expression, because it might only be valid after the query has been extended
_orderByBuilder.Generate(_resultType, out orderByClause, out orderByParameters, false /*applySortExpression*/);
return String.IsNullOrEmpty(orderByClause) ? queryT : queryT.OrderBy(orderByClause, orderByParameters);
}
private ObjectQuery ApplyOrderByAndPaging(ObjectQuery queryT)
{
// This re-applys the order-by as part of the skip
string orderByClause;
ObjectParameter[] orderByParameters;
_orderByBuilder.Generate(_resultType, out orderByClause, out orderByParameters, true /*applySortExpression*/);
bool paging = _arguments.MaximumRows > 0 && _arguments.StartRowIndex >= 0;
var hasOrderByClause = !String.IsNullOrEmpty(orderByClause);
if (paging)
{
if (!hasOrderByClause)
{
throw new InvalidOperationException(Strings.EntityDataSourceQueryBuilder_PagingRequiresOrderBy);
}
queryT = queryT.Skip(orderByClause, _arguments.StartRowIndex.ToString(CultureInfo.InvariantCulture), orderByParameters).Top(_arguments.MaximumRows.ToString(CultureInfo.InvariantCulture), QueryBuilderUtils.EmptyObjectParameters);
}
else
{
if (hasOrderByClause)
{
queryT = queryT.OrderBy(orderByClause, orderByParameters);
}
}
return queryT;
}
private ObjectQuery ApplyQueryableOrderByAndPaging(ObjectQuery queryT)
{
queryT = _orderByBuilder.BuildQueryableOrderBy(queryT) as ObjectQuery;
bool paging = _arguments.MaximumRows > 0 && _arguments.StartRowIndex >= 0;
if (paging)
{
queryT = queryT.Skip(_arguments.StartRowIndex).Take(_arguments.MaximumRows) as ObjectQuery;
}
return queryT;
}
private ObjectQuery ApplyIncludePaths(ObjectQuery objectQuery)
{
if (!string.IsNullOrEmpty(_includePaths))
{
foreach (string include in _includePaths.Split(','))
{
string trimmedInclude = include.Trim();
if (!string.IsNullOrEmpty(trimmedInclude))
{
objectQuery = objectQuery.Include(trimmedInclude);
}
}
}
return objectQuery;
}
}
internal class EntityDataSourceObjectQueryBuilder : EntityDataSourceQueryBuilder
{
private EntityDataSourceObjectQueryBuilder(DataSourceSelectArguments arguments,
string commandText, ObjectParameter[] commandParameters,
string whereExpression, ObjectParameter[] whereParameters, string entitySetQueryExpression,
string selectExpression, string groupByExpression, ObjectParameter[] selectParameters,
OrderByBuilder orderByBuilder,
string includePaths)
: base(arguments,
commandText, commandParameters,
whereExpression, whereParameters, entitySetQueryExpression,
selectExpression, groupByExpression, selectParameters,
orderByBuilder,
includePaths)
{
}
static internal EntityDataSourceQueryBuilder.Creator GetCreator()
{
return Create;
}
static internal EntityDataSourceQueryBuilder Create(DataSourceSelectArguments arguments,
string commandText, ObjectParameter[] commandParameters,
string whereExpression, ObjectParameter[] whereParameters, string entitySetQueryExpression,
string selectExpression, string groupByExpression, ObjectParameter[] selectParameters,
OrderByBuilder orderByBuilder,
string includePaths)
{
return new EntityDataSourceObjectQueryBuilder(arguments,
commandText, commandParameters,
whereExpression, whereParameters, entitySetQueryExpression,
selectExpression, groupByExpression, selectParameters,
orderByBuilder,
includePaths);
}
protected override ObjectQuery ApplySelect(ObjectQuery queryT)
{
return queryT;
}
}
internal class EntityDataSourceRecordQueryBuilder : EntityDataSourceQueryBuilder
{
private readonly string _selectExpression;
private readonly string _groupByExpression;
private readonly ObjectParameter[] _selectParameters;
private EntityDataSourceRecordQueryBuilder(DataSourceSelectArguments arguments,
string commandText, ObjectParameter[] commandParameters,
string whereExpression, ObjectParameter[] whereParameters, string entitySetQueryExpression,
string selectExpression, string groupByExpression, ObjectParameter[] selectParameters,
OrderByBuilder orderByBuilder,
string includePaths)
: base(arguments,
commandText, commandParameters,
whereExpression, whereParameters, entitySetQueryExpression,
selectExpression, groupByExpression, selectParameters,
orderByBuilder,
includePaths)
{
_selectExpression = selectExpression;
_groupByExpression = groupByExpression;
_selectParameters = selectParameters;
}
static internal EntityDataSourceQueryBuilder Create(DataSourceSelectArguments arguments,
string commandText, ObjectParameter[] commandParameters,
string whereExpression, ObjectParameter[] whereParameters, string entitySetQueryExpression,
string selectExpression, string groupByExpression, ObjectParameter[] selectParameters,
OrderByBuilder orderByBuilder,
string includePaths)
{
return new EntityDataSourceRecordQueryBuilder(arguments,
commandText, commandParameters,
whereExpression, whereParameters, entitySetQueryExpression,
selectExpression, groupByExpression, selectParameters,
orderByBuilder,
includePaths);
}
protected override ObjectQuery ApplySelect(ObjectQuery queryT)
{
Debug.Assert(!String.IsNullOrEmpty(_selectExpression), "Select expression should not be of zero length.");
if (!string.IsNullOrEmpty(_groupByExpression))
{
queryT = queryT.GroupBy(_groupByExpression, _selectExpression, _selectParameters);
}
else
{
queryT = queryT.Select(_selectExpression, _selectParameters);
}
return queryT;
}
}
internal static class QueryBuilderUtils
{
internal static readonly ObjectParameter[] EmptyObjectParameters = new ObjectParameter[] { };
internal static ObjectQuery ConstructQuery(ObjectContext context,
string entitySetQueryExpression,
string commandText,
ObjectParameter[] commandParameters)
{
string queryExpression;
ObjectParameter[] queryParameters;
if (!string.IsNullOrEmpty(commandText))
{
queryExpression = commandText;
queryParameters = commandParameters;
}
else
{
queryExpression = entitySetQueryExpression;
queryParameters = QueryBuilderUtils.EmptyObjectParameters;
}
return context.CreateQuery(queryExpression, queryParameters);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PipelineModuleStepContainer.cs
- ListViewItemEventArgs.cs
- TextContainer.cs
- PolyQuadraticBezierSegment.cs
- Exceptions.cs
- WebServiceEnumData.cs
- ListenerConstants.cs
- SerializationAttributes.cs
- Command.cs
- RichTextBox.cs
- TabPage.cs
- OutputCacheProfile.cs
- handlecollector.cs
- safemediahandle.cs
- IpcClientChannel.cs
- PersonalizableTypeEntry.cs
- Dump.cs
- LocatorPart.cs
- followingquery.cs
- TypeConverter.cs
- FrameworkReadOnlyPropertyMetadata.cs
- StaticExtension.cs
- unsafeIndexingFilterStream.cs
- URLMembershipCondition.cs
- AffineTransform3D.cs
- XsdDateTime.cs
- InstanceDescriptor.cs
- DesignBindingConverter.cs
- SoapServerProtocol.cs
- WindowsTreeView.cs
- ComboBoxRenderer.cs
- BaseAddressElementCollection.cs
- Canvas.cs
- SqlTypeSystemProvider.cs
- HandleCollector.cs
- BindingManagerDataErrorEventArgs.cs
- ImportOptions.cs
- Thickness.cs
- InkCanvasSelectionAdorner.cs
- BindingSource.cs
- SqlNodeTypeOperators.cs
- VerticalConnector.xaml.cs
- _ContextAwareResult.cs
- AspNetCompatibilityRequirementsAttribute.cs
- FrameworkTemplate.cs
- WebPartAddingEventArgs.cs
- ToolstripProfessionalRenderer.cs
- StringBuilder.cs
- WorkflowApplicationEventArgs.cs
- EntityCollectionChangedParams.cs
- AsymmetricSecurityProtocolFactory.cs
- DataControlFieldHeaderCell.cs
- ActionFrame.cs
- DataGridCellEditEndingEventArgs.cs
- IntegerFacetDescriptionElement.cs
- XPathNodeHelper.cs
- HwndKeyboardInputProvider.cs
- ManagementNamedValueCollection.cs
- OpCodes.cs
- TimelineGroup.cs
- ApplicationSecurityManager.cs
- _NetRes.cs
- ZipIOEndOfCentralDirectoryBlock.cs
- NameValueFileSectionHandler.cs
- TextFormatterHost.cs
- HttpListenerPrefixCollection.cs
- GeometryCollection.cs
- XDRSchema.cs
- PublisherMembershipCondition.cs
- TemplateControl.cs
- CmsUtils.cs
- GacUtil.cs
- SamlConstants.cs
- XamlToRtfParser.cs
- ToolStripItemEventArgs.cs
- ComplexObject.cs
- MetadataFile.cs
- CultureSpecificStringDictionary.cs
- AutoScrollExpandMessageFilter.cs
- StructuredTypeEmitter.cs
- SecurityKeyType.cs
- CopyOnWriteList.cs
- WorkflowInstanceTerminatedRecord.cs
- ClassicBorderDecorator.cs
- DrawingGroup.cs
- UnsafeNativeMethods.cs
- LogEntrySerialization.cs
- ResXFileRef.cs
- SqlDependencyListener.cs
- InteropBitmapSource.cs
- VectorValueSerializer.cs
- ViewValidator.cs
- PrtTicket_Public.cs
- PreProcessor.cs
- CompilationSection.cs
- DesignerView.cs
- RecognizerInfo.cs
- RedistVersionInfo.cs
- WebPartUserCapability.cs
- FieldNameLookup.cs