private void EvaluateCheckIn() { this.Logger().Trace("EvaluateCheckIn"); var pendingChanges = PendingChanges .Where(model => model.IncludeChange) .Select(model => model.Change) .ToArray(); if (!pendingChanges.Any()) { CheckinEvaluationResult = null; CheckinNotes.Clear(); return; } var currentCheckinNoteDefinitions = checkinNotesCacheWrapper.GetCheckinNotes(pendingChanges); var equalityComparer = CheckinNoteFieldDefinition.NameComparer.ToGenericComparer <CheckinNoteFieldDefinition>().ToEqualityComparer(); var modelIntersection = CheckinNotes .Join(currentCheckinNoteDefinitions, model => model.CheckinNoteFieldDefinition, checkinNoteFieldDefinition => checkinNoteFieldDefinition, (model, change) => model, equalityComparer) .ToArray(); var modelsToRemove = CheckinNotes.Where(model => !modelIntersection.Contains(model)).ToArray(); var modelsToAdd = currentCheckinNoteDefinitions .Where(checkinNoteFieldDefinition => !modelIntersection.Select(model => model.CheckinNoteFieldDefinition).Contains(checkinNoteFieldDefinition, equalityComparer)) .Select(checkinNoteFieldDefinition => new CheckinNoteModel(checkinNoteFieldDefinition)).ToArray(); foreach (var checkinNoteModel in modelsToAdd) { CheckinNotes.Add(checkinNoteModel); } foreach (var modelToRemove in modelsToRemove) { CheckinNotes.Remove(modelToRemove); } CheckinEvaluationResult checkinEvaluationResult; var workItemChanges = WorkItems .Where(model => model.IsSelected) .Select(model => new WorkItemCheckinInfo(model.WorkItem, model.WorkItemCheckinAction.ToWorkItemCheckinAction())).ToArray(); var checkinNoteFieldValues = CheckinNotes .Where(model => !string.IsNullOrWhiteSpace(model.Value)) .Select(model => new CheckinNoteFieldValue(model.CheckinNoteFieldDefinition.Name, model.Value)) .ToArray(); var checkinNote = new CheckinNote(checkinNoteFieldValues); if (teamPilgrimServiceModelProvider.TryEvaluateCheckin(out checkinEvaluationResult, Workspace, pendingChanges, Comment, checkinNote, workItemChanges)) { CheckinEvaluationResult = checkinEvaluationResult; } }