СУХАЯ логика для обработки вставки / обновления / удаления множества записей в ASP.NET MVC 3 - PullRequest
0 голосов
/ 24 января 2012

В моем приложении у меня достаточно много отношений между многими.Я обнаружил, что пишу довольно много кода, который выглядит примерно так (я взял пример кода из примера проекта Contoso для простоты ссылок):

private void UpdateInstructorCourses(int[] selectedCourses, Instructor instructorToUpdate)
    {
        if (selectedCourses == null)
        {
            instructorToUpdate.Courses = new List<Course>();
            return;
        }

        var selectedCoursesHS = new HashSet<int>(selectedCourses);
        var instructorCourses = new HashSet<int>(instructorToUpdate.Courses.Select(c => c.CourseID));

        foreach (var course in db.Courses)
        {
            if (selectedCoursesHS.Contains(course.CourseID))
            {
                if (!instructorCourses.Contains(course.CourseID))
                {
                    instructorToUpdate.Courses.Add(course);
                }
            }
            else
            {
                if (instructorCourses.Contains(course.CourseID))
                {
                    instructorToUpdate.Courses.Remove(course);
                }
            }
        }

    }

Мои отношения многие ко многимВ общем и целом, состоит из центральной таблицы с большим количеством данных и набором справочных таблиц, в которых есть поля Id и Name.

Вышеприведенное замечательно, когда есть один или два оператора man-to-manys, но онстановится немного утомительным, и у меня есть несколько методов, которые следуют одной и той же базовой логике, описанной выше, но, очевидно, используют разные dbsets в foreach и другой объект в качестве второго параметра.

Есть ли хороший способ СУШИТЬ несколькометоды вверх?

1 Ответ

0 голосов
/ 24 января 2012

Вы должны иметь возможность создать общий метод по этим направлениям (не проверенный и не скомпилированный в реальном контексте EF)

private void UpdateCollection<T>(int[] selectedIds, ICollection<T> dbCollection, ICollection<T> collectionToUpdate, Func<T, int> idGetter)
{
    if (selectedIds == null)
    {
        collectionToUpdate.Clear();
        return;
    }

    var selectedIdsHS = new HashSet<int>(selectedIds);
    var idsToUpdate = new HashSet<int>(collectionToUpdate.Select(idGetter));

    foreach (var elem in dbCollection)
    {
        var id = idGetter(elem);

        if (selectedIdsHS.Contains(id))
        {
            if (!idsToUpdate.Contains(id))
            {
                collectionToUpdate.Add(elem);
            }
        }
        else
        {
            if (idsToUpdate.Contains(id))
            {
                collectionToUpdate.Remove(elem);
            }
        }
    }

}

Он может быть вызван следующим образом:

UpdateCollection(new[] {1,2,3}, db.Courses, instructor.Courses, c => c.CourseID);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...