2009-06-28 3 views
1

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

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

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

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

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

ответ

4

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

Для относительно небольшого числа - просто используйте инструмент 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 - тогда вам не нужно постоянно присоединяться к таблице.


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

+0

Я использую LINQ-TO-SQL, и я хочу вставить 10-20 записей за раз. Вышеуказанный запрос вставляет одно значение за раз. Могу ли я вставить все 10-20 значений за один раз и по-прежнему получить TagID –

+1

Вы можете использовать столько «InsertOnSubmit», сколько вам нужно. TagID не будет доступен до тех пор, пока вы не назовете 'SubmitChanges', но на самом деле он вам не нужен - вы должны дать объектам' VideoTag' соответствующий объект 'tag'. Конечно, с естественным ключом это не проблема. –

+1

Обратите внимание, что вы можете захотеть кэшировать известные теги в локальном словаре - иначе вы можете сделать некоторые ненужные SQL-запросы. Я обновлю ... –