MergeResultsAsync(int queryId, IList <TodoItemReference> lastResults, IList <TodoListItem> matchedItems) { // remove stale result items var mergedResults = new List <TodoItemReference>(); foreach (TodoItemReference result in lastResults) { var item = matchedItems.FirstOrDefault(i => i.Id == result.Item.Id); if (item != null) { // result still relevant, remove it from matching list matchedItems.Remove(item); mergedResults.Add(result); } else { // result is stale, remove it from result set PositionAdjuster.AdjustForDelete(result, lastResults.ToList <ISortable>()); _context.TodoReferences.Delete(result); } } // append new ones foreach (TodoListItem item in matchedItems) { var result = new TodoItemReference() { Item = item, Position = mergedResults.Count, TodoQueryId = queryId }; mergedResults.Add(result); await _context.TodoReferences.AddAsync(result); } return(mergedResults); }
public async Task <ActionResult <TodoItemReference> > MoveReferenceAsync(int id, [FromBody] TodoItemReference reference) { var current = await _context.TodoReferences.GetAsync(id); if (current == null) { return(NotFound()); } // re-arrange other references affected by move var references = await _context.TodoReferences.GetAsync(r => r.TodoQueryId == reference.TodoQueryId); PositionAdjuster.AdjustForUpdate(reference, references.ToList <ISortable>(), current); // move reference to desired location current.UpdateFrom(reference); _context.TodoReferences.Update(current); await _context.SaveChangesAsync(); return(current); }