Code:
/ 4.0 / 4.0 / 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. //---------------------------------------------------------------------- // // 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
- SelectionEditingBehavior.cs
- DataListItemEventArgs.cs
- TransportContext.cs
- PostBackOptions.cs
- XmlSchemaObject.cs
- List.cs
- ApplicationServiceManager.cs
- StringWriter.cs
- ComplexTypeEmitter.cs
- ContentFileHelper.cs
- WebServiceClientProxyGenerator.cs
- shaper.cs
- ToolStripSplitButton.cs
- ToolboxDataAttribute.cs
- RenderOptions.cs
- MonitorWrapper.cs
- ToolStripProfessionalLowResolutionRenderer.cs
- OleDbDataAdapter.cs
- figurelength.cs
- HttpCachePolicyElement.cs
- XmlUnspecifiedAttribute.cs
- TextRangeEditLists.cs
- ToolStripSettings.cs
- ContextMenuStrip.cs
- isolationinterop.cs
- ExpressionPrinter.cs
- UnicodeEncoding.cs
- ISAPIWorkerRequest.cs
- HandlerElementCollection.cs
- HttpWriter.cs
- HttpCacheVaryByContentEncodings.cs
- ComponentSerializationService.cs
- TemplateBaseAction.cs
- SamlSubject.cs
- DesignBindingValueUIHandler.cs
- StandardOleMarshalObject.cs
- MenuAdapter.cs
- ObjectDataProvider.cs
- SafeArrayRankMismatchException.cs
- InkCanvas.cs
- WinFormsSecurity.cs
- CallContext.cs
- TimeSpan.cs
- ToolStripDropDownClosingEventArgs.cs
- SqlCacheDependencyDatabaseCollection.cs
- XsltQilFactory.cs
- DataGridBoolColumn.cs
- XamlStyleSerializer.cs
- Processor.cs
- XomlCompilerParameters.cs
- TextureBrush.cs
- AspNetHostingPermission.cs
- QilGenerator.cs
- StylusSystemGestureEventArgs.cs
- LayoutManager.cs
- HtmlInputFile.cs
- Configuration.cs
- XpsFixedDocumentSequenceReaderWriter.cs
- SubpageParaClient.cs
- SchemaTableColumn.cs
- HttpCachePolicy.cs
- SerializableAttribute.cs
- BrushConverter.cs
- ImageAttributes.cs
- TextServicesCompartmentContext.cs
- WebPartActionVerb.cs
- PreviewPrintController.cs
- StateChangeEvent.cs
- AddDataControlFieldDialog.cs
- RawUIStateInputReport.cs
- Pointer.cs
- NameValueSectionHandler.cs
- ZipPackagePart.cs
- COM2PropertyBuilderUITypeEditor.cs
- ComplexObject.cs
- DispatcherOperation.cs
- ContextMenuAutomationPeer.cs
- JsonMessageEncoderFactory.cs
- FontDriver.cs
- CompilerErrorCollection.cs
- SizeAnimationBase.cs
- RuntimeArgumentHandle.cs
- CodeMemberProperty.cs
- FontResourceCache.cs
- PanelContainerDesigner.cs
- TimeoutValidationAttribute.cs
- DetailsViewUpdatedEventArgs.cs
- CustomErrorsSectionWrapper.cs
- Encoder.cs
- SettingsProperty.cs
- LateBoundChannelParameterCollection.cs
- PointAnimation.cs
- StreamReader.cs
- SqlTrackingWorkflowInstance.cs
- EntityViewContainer.cs
- FixedDocumentSequencePaginator.cs
- LocalBuilder.cs
- FlowDocumentPageViewerAutomationPeer.cs
- PropertyInfoSet.cs
- WithStatement.cs