Проверка существования перед вставкой через Linq в SQL - PullRequest
2 голосов
/ 21 декабря 2008

Я хотел бы знать, есть ли более простой способ пакетной вставки набора записей, если они еще не существуют в таблице. Например, у меня есть таблица тегов в базе данных, в которой есть столбцы идентификаторов, имен и имен. В списке имен тегов я хочу добавить только те, которых еще нет. Вот что я придумал:

private static void InsertTags(IEnumerable<string> tagNames)
{
    MyDataContext db = new MyDataContext();

    var tags = from tagName in tagNames
    where (db.Tags.Where(tag => tagName == tag.Name).FirstOrDefault() == null) 
    select new Tag
    {
        Name = tagName 
    };
    db.Tags.InsertAllOnSubmit(tags);
}

Есть ли лучший подход?

Ответы [ 2 ]

1 голос
/ 21 декабря 2008

Обратите внимание, что вы фактически не отправляете эти изменения, и в идеале вы должны быть using контекстом, чтобы гарантировать, что он получает Dispose() d.

Оптимальный подход - в LINQ-to-SQL есть сбой, при котором наилучшим способом получения отдельной записи является использование методов Single(pred) или SingleOrDefault(pred), поскольку эти методы используют диспетчер идентификации для первичной ключевые запросы. Значение: если вы спрашиваете джуты по первичному ключу, а контекст данных уже знает о записи, он не попадет в базу данных. Большинство других запросов do попадают в базу данных (включая .Where(pred).Single()). Так что, если Name является первичным ключом, я бы настроил:

db.SingleOrDefault(tag => tagName == tag.Name)

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

1 голос
/ 21 декабря 2008

Я не уверен, но на самом деле я думаю, что это оптимально. Единственный способ улучшить производительность, если он критичен, - это использовать SP, SP можно получить через linq to sql.

Имейте в виду, что команда InsertAllOnSubmit не выполняет массовое обновление, только множество отдельных обновлений. http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2747627&SiteID=1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...