Обновление таблицы новыми объектами без массового удаления через LINQ to SQL в C # - PullRequest
1 голос
/ 02 октября 2010

Я новичок в программировании баз данных и хочу несколько советов по производительности / лучшие практики. Я анализирую некоторые веб-сайты и собираю информацию о телевизионных эпизодах и помещаю их в реляционную базу данных MS SQL 2008 R2.

Допустим, у меня есть таблица, заполненная типом Эпизод. Когда я начинаю новый анализ, я генерирую новый список Эпизодов. Дело в том, что я хочу, чтобы база данных точно соответствовала новому списку. В настоящее время я делаю массовое удаление всех, затем вставляю все. Проблема в том, что я не уверен, что это лучший способ, особенно потому, что я обеспокоен постоянством данных (первичные индексы episode_id остаются неизменными в течение длительных периодов времени).

Есть ли какой-нибудь простой способ вставить любые новые эпизоды в таблицу, обновить те, которые были изменены, и удалить те, которые больше не существуют, так, чтобы конечный результат был точно таким же, как новый список эпизодов. Эпизод будет сравниваться по идентификатору серии, номеру сезона и номеру эпизода.

Edit:

Тип Серии содержит список нескольких различных типов эпизодов, например:

List<TVDBEpisode>
List<TVRageEpisode>
List<TVcomEpisode>

Я бы анализировал один сайт за раз, например:

    public void ParseTVDB(Series ser)
    {
        var eps = new List<TVDBEpisode>();
        //... Parse tvdb and add each epsiode to this list
        //... Make the Series' existing TVDBEpisodes match the new TVDBEpisodes
    }

    public void ParseTVRage(Series ser)
    {
        var eps = new List<TVRageEpisode>();
        //... Parse tvrage and add each epsiode to this list
        //... Make the Series' existing TVRageEpisodes match the new TVRageEpisodes
    }

    public void ParseTVcom(Series ser)
    {
        var eps = new List<TVcomEpisode>();
        //... Parse tvcom and add each epsiode to this list
        //... Make the Series' existing TVcomEpisodes match the new TVcomEpisodes
    }

Ответы [ 2 ]

2 голосов
/ 02 октября 2010

Да, взгляните на AttachAllOnSubmit (), InsertAllOnSubmit () и DeleteAllOnSubmit ().Методы встроены в LINQ to SQL и будут выполнять соответствующие операции, на которые вы ссылаетесь выше.Вот пример кода .

0 голосов
/ 05 октября 2010

В итоге я использовал совершенно другой подход, но он сделал свою работу. Рисунок, я бы разместил его здесь на тот случай, если у кого-то возникнет похожая проблема, и мне интересно, как я ее решил. Я не слишком знаком со спецификой SQL, так как я новичок в базах данных, но я довольно хорошо разбираюсь в LINQ из обычных запросов к объектам, поэтому я решил использовать подход LINQ полностью.

Измените частичный класс, включив в него переменную, чтобы проверить, был ли элемент найден в этот раз:

public partial class TVDBEpisode
{
    public bool IsFound { get; set; }
}

Разобрать новые эпизоды, связав их с любыми существующими

public void ParseTVDB(Series ser)
{
    var oldEps = ser.TVDBEpisodes.ToList();

    foreach ( /*LOOP THROUGH FOUND EPISODES FROM TVDB */ )
    {
        string season = ;// parse season from website
        string epnumber = ;// parse epnumber from website

        TVDBEpisode ep;
        // Find an episode that matches this one already in database
        var oldEp = oldEps.FirstOrDefault((o) => o.Season == season && o.EpNumber == epnumber);
        if (oldEp == null)
        {
            // Create new item
            ep = new TVDBEpisode();
            // link with series (auto adds new item to the database)
            ser.TVDBEpisodes.Add(ep);
        }
        else
        {
            // Get the item already in the database so we can modify it
            ep = oldEp;
        }
        ep.SeasonNumber = season;
        ep.EpisodeNumber = epnumber;

        //PARSE THE REST OF THE INFO FOR THE EPISODE

        // Set IsFound to true, because this item has been updated
        ep.IsFound = true;

        // Delete any item that was not updated (IsFound == false)
        // Note that this only works on a fresh series that has been wiped where all eps start as false
        context.TVDBEpisodes.DeleteAllOnSubmit(oldEps.Where((t) => !t.IsFound));
        context.SubmitChanges();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...