protected override void MakeTaskForRequest(AsyncDataSourcePageRequest request, int retryDelay) { int actualPageSize = 0; SortDescriptionCollection sortDescriptions = null; lock (SyncLock) { actualPageSize = ActualPageSize; sortDescriptions = SortDescriptions; } StringBuilder sb = new StringBuilder(); sb.Append("SELECT "); lock (SyncLock) { UpdateSelect(); AddSelect(sb); AddTableExpression(sb); UpdateFilterClause(); AddFilterClause(sb); AddOrderByClause(sb); } Task task = null; if (request.Index == SchemaRequestIndex) { var query = "SELECT count(*) FROM " + _tableExpression; task = _connection.ExecuteScalarAsync <int>(query); } else { sb.Append(" LIMIT " + actualPageSize + " OFFSET " + request.Index * actualPageSize); var query = sb.ToString(); EnsureSpecific(); task = GetResult(query, _specific, true); } request.TaskHolder = new AsyncDataSourcePageTaskHolder(); request.TaskHolder.Task = task; lock (SyncLock) { Tasks.Add(request); } }
protected override void MakeTaskForRequest(AsyncDataSourcePageRequest request, int retryDelay) { int actualPageSize = 0; SortDescriptionCollection sortDescriptions = null; lock (SyncLock) { actualPageSize = ActualPageSize; sortDescriptions = SortDescriptions; } ODataFeedAnnotations annotations = new ODataFeedAnnotations(); var client = _client.For(_entitySet); lock (SyncLock) { if (FilterExpressions != null && FilterExpressions.Count > 0 && _filterString == null) { StringBuilder sb = new StringBuilder(); bool first = true; foreach (var expr in FilterExpressions) { if (first) { first = false; } else { sb.Append(" AND "); } ODataDataSourceFilterExpressionVisitor visitor = new ODataDataSourceFilterExpressionVisitor(); visitor.Visit(expr); var txt = visitor.ToString(); if (FilterExpressions.Count > 1) { txt = "(" + txt + ")"; } sb.Append(txt); } _filterString = sb.ToString(); } if (_filterString != null) { client = client.Filter(_filterString); } if (SortDescriptions != null) { foreach (var sort in SortDescriptions) { if (sort.Direction == System.ComponentModel.ListSortDirection.Descending) { client = client.OrderByDescending(sort.PropertyName); } else { client = client.OrderBy(sort.PropertyName); } } } if (DesiredProperties != null && DesiredProperties.Length > 0) { client = client.Select(DesiredProperties); } } Task task; if (request.Index == SchemaRequestIndex) { task = client .Count() .FindScalarAsync<int>(); } else { task = client .Skip(request.Index * actualPageSize) .Top(actualPageSize) .FindEntriesAsync(annotations); } request.TaskHolder = new AsyncDataSourcePageTaskHolder(); request.TaskHolder.Task = task; lock (SyncLock) { Tasks.Add(request); _annotations.Add(annotations); } }