Как получить первичный ключ от таблицы, не совершая вторую поездку?

Как я получил бы Идентификационный номер первичного ключа от Таблицы, не совершая вторую поездку в базу данных в LINQ К SQL?

Прямо сейчас я отправляю данные таблице и совершаю другую поездку для выяснения, какой идентификатор был присвоен новому полю (в автоматическом инкрементном идентификационном поле). Я хочу сделать это в LINQ К SQL а не в Сырых данных SQL (я больше не использую Сырых данных SQL).

Кроме того, вторая часть моего вопроса: Я всегда стараюсь знать идентификатор пользователя, это онлайн, потому что я назвал бы их информацию в различных таблицах с помощью их идентификатора в противоположность использованию GUID или имени пользователя, которые являются всеми длинными строками. Я делаю это, потому что я думаю, что SQL Server, делающий числовое, выдерживает сравнение, намного (?) более эффективно, чем выполнение имени пользователя (строка) или даже гуид (очень длинная строка) выдерживает сравнение. Мои вопросы, я более заинтересован, чем я должен быть? Действительно ли различие всегда стоит удержать идентификатор пользователя (int32), говорят, состояние сеанса?


@RedFilter обеспечил, некоторые интересные/многообещающие ведут для первого вопроса, потому что я на данном этапе не могу судить их, если кто-либо знает или может подтвердить эти изменения, которые он рекомендовал в разделе комментариев его ответа?

5
задан dty 1 March 2013 в 16:45
поделиться

5 ответов

Если у вас есть ссылка на объект, вы можете просто использовать эту ссылку и вызвать первичный ключ после вызова db.SubmitChanges(). Объект LINQ автоматически обновит свое поле первичного ключа (Identifier) для отражения нового, назначенного ему через SQL Server.

Пример (vb.net):

  Dim db As New NorthwindDataContext
  Dim prod As New Product
  prod.ProductName = "cheese!"
  db.Products.InsertOnSubmit(prod)
  db.SubmitChanges()
  MessageBox.Show(prod.ProductID)

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

EDIT: Если вы не делаете атомарных обновлений, вы можете добавить каждый новый продукт в отдельную Коллекцию и выполнить через нее итерацию после вызова SubmitChanges. Я бы хотел, чтобы LINQ обеспечил "подглядывание в базу данных", как это делает набор данных.

12
ответ дан 18 December 2019 в 09:07
поделиться

Если вы не делаете что-то необычное, вам не нужно делать что-то дополнительное для получения главного ключа, который генерируется.

При вызове DataContext на DataContext в вашем Ninq-to-SQL он автоматически обновляет значения основных ключей для ваших объектов.

Что касается вашего второго вопроса - может быть небольшое улучшение производительности, выполнив сканирование на цифровом поле, в отличие от чего-то вроде varchar (), но вы увидите гораздо лучшую производительность в любом случае, обеспечивая, что у вас есть правильные столбцы в вашем База данных индексирована. И, с SQL Server, если вы создаете первичный ключ, используя столбец Identity, он по умолчанию по умолчанию будет кластеризованный индекс по нему.

4
ответ дан 18 December 2019 в 09:07
поделиться

LINQ для SQL автоматически устанавливает значение удостоверения личности вашего класса с помощью идентификатора, создаваемого при вставке новой записи. Просто доступа к недвижимости. Я не знаю, использует ли он отдельный запрос для этого или нет, никогда не использовав его, но нередственно для ORMS требует другого запроса, чтобы вернуть последний вставленный идентификатор.

Два способа сделать это независимо от Linq для SQL (это может работать с ним):

1) Если вы используете SQL Server 2005 или выше, вы можете использовать пункт вывода:

возвращает информацию из , или же Выражения основаны на каждой строке пострадавших от вставки, обновления или Удалить заявление. Эти результаты могут быть Вернулся к приложению обработки для использования в таких вещах, как подтверждение сообщения, архивирование и другие такие Требования к кандидатам. Альтернативно, результаты могут быть вставлены в таблицу или таблицу переменной.

2) попеременно, вы можете построить оператор пакетной вставки, подобную этому:

insert into MyTable
(field1)
values
('xxx');
select scope_identity();

, который работает, по крайней мере, поскольку SQL Server 2000.

2
ответ дан 18 December 2019 в 09:07
поделиться

В T-SQL вы можете использовать пункт выхода, говоря:

INSERT table (columns...)
OUTPUT inserted.ID
SELECT columns...

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

0
ответ дан 18 December 2019 в 09:07
поделиться

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

Итак, например, старая версия находится в кэше загрузки, не будет автоматически перезаписан новой версией, отличающейся только в сборке Cileversion.

Это может быть запутано для среднего разработчика, отсюда и правило.

Конечно, если вы знаете, что вы делаете и понимаете компромиссы, вы можете игнорировать правило.

-121--3147275-

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

0
ответ дан 18 December 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: