protected internal override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments) { ClearOriginalValues(); QueryContext queryContext = CreateQueryContext(arguments); object table = GetSource(queryContext); IList result = null; if (_selectResult != null) { try { IQueryable query = QueryableDataSourceHelper.AsQueryable(_selectResult); query = ExecuteQuery(query, queryContext); Type dataObjectType = GetDataObjectType(query.GetType()); result = query.ToList(dataObjectType); if (_storeOriginalValues) { ITable dlinqTable = table as ITable; // We can store original values if the type is exact or derived if ((dlinqTable != null) && dataObjectType.IsAssignableFrom(EntityType)) { StoreOriginalValues(result); } } } catch (Exception e) { result = null; LinqDataSourceStatusEventArgs selectedEventArgs = new LinqDataSourceStatusEventArgs(e); OnSelected(selectedEventArgs); OnException(new DynamicValidatorEventArgs(e, DynamicDataSourceOperation.Select)); if (!selectedEventArgs.ExceptionHandled) { throw; } } finally { if (result != null) { int totalRowCount = -1; // paging performed, but row count not available. if (arguments.RetrieveTotalRowCount) { totalRowCount = arguments.TotalRowCount; } else if (!AutoPage) { totalRowCount = result.Count; } LinqDataSourceStatusEventArgs selectedEventArgs = new LinqDataSourceStatusEventArgs(result, totalRowCount); OnSelected(selectedEventArgs); } } // Null out the select context Context = null; } return(result); }
private bool OriginalValueMatches(object originalValue, object value) { // NOTE: Comparing IEnumerable contents instead of instances to ensure that // timestamp columns (of type byte[]) can be matched appropriately. IEnumerable originalValueEnumerable = originalValue as IEnumerable; IEnumerable valueEnumerable = value as IEnumerable; if ((originalValueEnumerable != null) && (valueEnumerable != null)) { return(QueryableDataSourceHelper.EnumerableContentEquals(originalValueEnumerable, valueEnumerable)); } return(originalValue.Equals(value)); }
/// <summary> /// Creates a select expression based on parameters and properties /// </summary> protected virtual IQueryable BuildQuery(DataSourceSelectArguments arguments) { if (arguments == null) { throw new ArgumentNullException("arguments"); } // Create the query context QueryContext context = CreateQueryContext(arguments); // Clear out old values before selecting new data _originalValues = null; // Get the source of the query(root IQueryable) object result = GetSource(context); if (result != null) { IQueryable source = QueryableDataSourceHelper.AsQueryable(result); // Apply additional filterting return(ExecuteQuery(source, context)); } return(null); }
protected IQueryable ExecuteQueryExpressions(IQueryable source, QueryContext context) { if (source != null) { QueryCreatedEventArgs queryArgs = new QueryCreatedEventArgs(source); OnQueryCreated(queryArgs); source = queryArgs.Query ?? source; // Support the Dynamic Expression language used by LinqDataSource if (AutoGenerateWhereClause) { if (!String.IsNullOrEmpty(Where)) { throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, AtlasWeb.LinqDataSourceView_WhereAlreadySpecified, _owner.ID)); } source = QueryableDataSourceHelper.CreateWhereExpression(context.WhereParameters, source, _queryable); } else if (!String.IsNullOrEmpty(Where)) { source = _queryable.Where(source, Where, context.WhereParameters.ToEscapedParameterKeys(_owner)); } if (AutoGenerateOrderByClause) { if (!String.IsNullOrEmpty(OrderBy)) { throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, AtlasWeb.LinqDataSourceView_OrderByAlreadySpecified, _owner.ID)); } source = QueryableDataSourceHelper.CreateOrderByExpression(context.OrderByParameters, source, _queryable); } else if (!String.IsNullOrEmpty(OrderBy)) { source = _queryable.OrderBy(source, OrderBy, context.OrderByParameters.ToEscapedParameterKeys(_owner)); } string groupBy = GroupBy; if (String.IsNullOrEmpty(groupBy)) { if (!String.IsNullOrEmpty(OrderGroupsBy)) { throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, AtlasWeb.LinqDataSourceView_OrderGroupsByRequiresGroupBy, _owner.ID)); } } else { source = _queryable.GroupBy(source, groupBy, "it", context.GroupByParameters.ToEscapedParameterKeys(_owner)); if (!String.IsNullOrEmpty(OrderGroupsBy)) { source = _queryable.OrderBy(source, OrderGroupsBy, context.OrderGroupsByParameters.ToEscapedParameterKeys(_owner)); } } if (!String.IsNullOrEmpty(SelectNew)) { source = _queryable.Select(source, SelectNew, context.SelectParameters.ToEscapedParameterKeys(_owner)); } return(source); } return(source); }