У меня есть таблица тегов. Как массовая вставка с использованием LINQ? - PullRequest
1 голос
/ 28 июня 2009

Я использую VB.NET с LINQ to MS SQL. У меня есть две следующие таблицы. Теперь я хочу вставить несколько элементов в таблицу тегов с помощью LINQ, но также хочу проверить, существует ли какой-либо из тегов в таблице тегов. Он не вставляет его снова и возвращает TagID в обоих случаях (если он был вставлен или был найден)

CREATE TABLE Tags
    (TagID bigint not null , 
    Tag varchar(100) NULL )

CREATE TABLE VideoTags
    (VideoID bigint not null , 
    TagID bigint not null )

Какой лучший способ добиться этого с помощью LINQ?

Заранее спасибо

1 Ответ

4 голосов
/ 28 июня 2009

LINQ - это технология query , но я думаю, что мы знаем, что вы имеете в виду; Возможно, вы захотите быть более конкретным, будь то LINQ-to-SQL или Entity Framework. Вы также можете уточнить, что означает «объемная» в вашем случае ... для 10-100 записей вы можете использовать другой ответ для 10000 записей (где SqlBulkCopy в промежуточной таблице и хранимая процедура для импорта в БД будет будь лучшей идеей).

Для относительно небольшого числа - просто используйте инструмент ORM для поиска записей - например, с LINQ-to-SQL (возможно, с охватывающей сериализуемой транзакцией) - и используйте C # для иллюстрации ( обновлено, чтобы показать цикл и кэш ):

Dictionary<string,Tag> knownTags = new Dictionary<string,Tag>();
foreach(... your data ...) {
    Tag tag;
    if(!knownTags.TryGetValue(tagName, out tag)) {
        tag = ctx.Tags.SingleOrDefault(t => t.Name == tagName);
        if(tag == null) {
            tag = new Tag { Name = tagName };
            ctx.Tags.InsertOnSubmit(tag);
        }
        knownTags.Add(tagName, tag);
    }
    // insert video tag
}
ctx.SubmitChanges();

На самом деле, из соображений производительности мне интересно, может ли это быть одним из тех случаев, когда имеет смысл использовать естественный ключ - то есть использовать Tag (varchar) в качестве первичного ключа и дублировать его (в качестве внешнего ключа) ) в VideoTags - тогда вам не нужно все время присоединяться к таблице Tags.


Если числа больше, использовать довольно просто SqlBulkCopy; просто поместите данные в DataTable и переместите их, затем выполните работу в TSQL.

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