LibiadaWeb.Models.Repositories.Sequences.ElementRepository.GetOrCreatePitchesInDb C# (CSharp) Method

GetOrCreatePitchesInDb() private method

The get or create pitches in db.
private GetOrCreatePitchesInDb ( List pitches ) : int[]
pitches List /// The pitches. ///
return int[]
        private int[] GetOrCreatePitchesInDb(List<Pitch> pitches)
        {
            var newPitches = new List<LibiadaWeb.Pitch>();
            var result = new int[pitches.Count];

            for (int i = 0; i < pitches.Count; i++)
            {
                var pitch = pitches[i];
                var noteSymbol = pitch.Step.ToString();
                var accidental = pitch.Alter.ToString();

                if (db.Pitch.Any(p => p.Midinumber == pitch.MidiNumber))
                {
                    var databasePitch = db.Pitch.Include(p => p.NoteSymbol).Include(p => p.Accidental).Single(p => p.Midinumber == pitch.MidiNumber);
                    result[i] = databasePitch.Id;

                    if (pitch.Alter.ToString() != databasePitch.Accidental.Name
                        || pitch.Step.ToString() != databasePitch.NoteSymbol.Name
                        || pitch.Octave != databasePitch.Octave)
                    {
                        throw new Exception("Found in db pitch not equals to local pitch.");
                    }
                }
                else
                {
                    var newPitch = new LibiadaWeb.Pitch
                    {
                        AccidentalId = db.Accidental.Single(a => a.Name == accidental).Id,
                        NoteSymbolId = db.NoteSymbol.Single(n => n.Name == noteSymbol).Id,
                        Octave = pitch.Octave,
                        Midinumber = pitch.MidiNumber
                    };
                    newPitches.Add(newPitch);
                    result[i] = newPitch.Id;
                }
            }

            db.Pitch.AddRange(newPitches);
            db.SaveChanges();
            return result;
        }