後に実行され、重複エントリの削除ストアドプロシージャを、書き、
var foo = new MyFoo { Name = "foo1" };
var dc = new MyDataContext();
dc.Foos.InsertOnSubmit(foo);
dc.SubmitChanges();
あなたのID列をどのように増分しているかを確認する必要があります。これは、テーブルのInsertOnSumbit()を呼び出すことです。一般的に、私は自分のID列に必ずIDENTITY(1,1)設定を使用するようにします。これがそうのようなあなたのLINQのエンティティのid列に宣言されています:
[Column(AutoSync = AutoSync.OnInsert, IsPrimaryKey = true, IsDbGenerated = true)]
public Int32 Id { get; set; }
重複を避けるために、あなたが本当に必要なものを私たちは機能「を追加」私の店で呼んでいます。私見では、これが最も簡単にストアドプロシージャを用いて達成される - 私たちも、私たちはそれに使用するテンプレートを持っている:
USE [<Database_Name, sysobject, Database_Name>]
GO
CREATE PROCEDURE [<Schema, sysobject, dbo>].[<Table_Name, sysobject, Table_Name>__append]
(
@id INT OUTPUT,
@<Key_Param, sysobject, Key_Param> <Key_Param_Type, sysobject, VARCHAR(50)>
)
AS
BEGIN
SELECT @id = [id] FROM [<Schema, sysobject, dbo>].[<Table_Name, sysobject, Table_Name>s] (NOLOCK) WHERE [<Key_Param, sysobject, Key_Param>] = @<Key_Param, sysobject, Key_Param>
IF @id IS NULL
BEGIN
INSERT INTO [<Schema, sysobject, dbo>].[<Table_Name, sysobject, Table_Name>s] ([<Key_Param, sysobject, Key_Param>])
OUTPUT INSERTED.[id] INTO @inserted_ids
VALUES (@<Key_Param, sysobject, Key_Param>)
SELECT TOP 1 @id = [id] FROM @inserted_ids;
END
ELSE
BEGIN
UPDATE [<Schema, sysobject, dbo>].[<Table_Name, sysobject, Table_Name>s]
SET
[<Key_Param, sysobject, Key_Param>] = @<Key_Param, sysobject, Key_Param>
WHERE [id] = @id
END
END
GO
しかしLINQでそれを行うだけで、既存のIDのリストを照会することが可能である(または何あなたがのキーイングオフしているコラム):それは挿入を実行する前に、LINQ to SQLのデータベースをチェックしないよう
var dc = new MyDataContext();
var existingFoos = dc.Foos.ToList();
var newFoos = new List<Foo>();
foreach(var bar in whateverYoureIterating) {
// logic to add to newFoos
}
var foosToInsert = newFoos.Where(newFoo => !existingFoos.Any(existingFoo => newFoo.Id == existingFoo.Id));
dc.Foos.InsertAllOnSubmit(foosToInsert);
dc.SubmitChanges();
// use the next line if you plan on re-using existingFoos. If that's the case I'd wrap dc.SubmitChanges() in a try-catch as well.
existingFoos.AddRange(foosToInsert);
あなたの編集を待っています... –
LINQソリューションはかなり遅いようです。巨大なテーブルを照会すると、メモリ内の内容を読み込むことができないようです。たぶん私はSPのアプローチに固執すべきです。 –
それは私が想像したことです...しかし、あなたは本当に必要なプロパティを選択するだけで、LINQの解決をスピードアップすることができます...例えば、ID列だけです。また、複数の実行に対して「既存の」クエリを再利用できる場合は、同様に役立ちます。 –