Re[3]: Возможен ли такой запрос на Linq?
От: rameel https://github.com/rsdn/CodeJam
Дата: 13.03.11 21:46
Оценка: 66 (1)
Здравствуйте, rameel, Вы писали:

Добавлю также, что для некоторых баз, например Postgre, запрос выглядит с фиктивной таблицей Dual
INSERT INTO Roles(Name)
SELECT 'Admin'
FROM Dual
WHERE 
    NOT EXISTS(SELECT * FROM Roles WHERE Name = 'Admin');

Для MSSQL это не обязательно
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re[3]: Возможен ли такой запрос на Linq?
От: IT Россия linq2db.com
Дата: 13.03.11 21:39
Оценка: 9 (1)
Здравствуйте, rameel, Вы писали:

IT>>Для начала хорошо бы это выразить на SQL.

R>Ровно так как в примере выше В общем, например, есть такая таблица:

Не знал, что INSERT SELECT можно использовать без FROM. В общем, век живи, век учись, всё равно дураком помрёшь.

Для такого случая лучше всего будет сделать перегрузку Insert/InsertWithIdentity с предикатом.
Если нам не помогут, то мы тоже никого не пощадим.
Возможен ли такой запрос на Linq?
От: rameel https://github.com/rsdn/CodeJam
Дата: 13.03.11 01:34
Оценка:
Задался тут вопросом, можно ли такой запрос создать посредством линка? Смысл в том, чтобы добавить запись в таблицу только если ее там нет.

INSERT TestTable(Data)
SELECT 'value'
WHERE 
    NOT EXISTS(SELECT Data FROM TestTable WHERE Data = 'value');
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re: Возможен ли такой запрос на Linq?
От: IT Россия linq2db.com
Дата: 13.03.11 19:30
Оценка:
Здравствуйте, rameel, Вы писали:

R>Задался тут вопросом, можно ли такой запрос создать посредством линка? Смысл в том, чтобы добавить запись в таблицу только если ее там нет.


Для начала хорошо бы это выразить на SQL.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Возможен ли такой запрос на Linq?
От: rameel https://github.com/rsdn/CodeJam
Дата: 13.03.11 20:45
Оценка:
Здравствуйте, IT, Вы писали:

R>>Задался тут вопросом, можно ли такой запрос создать посредством линка? Смысл в том, чтобы добавить запись в таблицу только если ее там нет.


IT>Для начала хорошо бы это выразить на SQL.


Ровно так как в примере выше В общем, например, есть такая таблица:

CREATE TABLE Roles (
    ID   INT          NOT NULL PRIMARY KEY CLUSTERED IDENTITY(1,1),
    Name NVARCHAR(50) NOT NULL UNIQUE
);

INSERT INTO Roles(Name) VALUES(N'Admin');
INSERT INTO Roles(Name) VALUES(N'Manager');
INSERT INTO Roles(Name) VALUES(N'Editor');


Теперь, если попытаться добавить запись Admin, то чтобы не кидаться исключением о том, что такая запись уже есть, нужно проверить ее наличие перед вставкой, хотя можно было бы объединить проверку и вставку в одном запросе:
INSERT INTO Roles(Name)
SELECT N'Admin'
WHERE 
    NOT EXISTS(SELECT * FROM Roles WHERE Name = N'Admin');


Впрочем, это чисто так сказать интерес академический, так как в коде и так все лаконично:
using (var db = _factory.CreateDbManager())
    if (!db.Roles.Any(r => r.Name == name))
        new SqlQuery().Insert(db, new Role {Name = name});
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.