| layout | default | |||
|---|---|---|---|---|
| sidebar | operations | |||
| title | Merge | |||
| permalink | /operation/merge | |||
| tags |
|
|||
| parent | OPERATIONS |
This method is used to insert a new row or update an existing row from the table. This operation only works like UPSERT, it does not do any deletion.
Below is the sample code to merge a row into the [dbo].[Person] table.
using (var connection = new SqlConnection(connectionString))
{
var person = new Person
{
Id = 10045,
Name = "John Doe",
Address = "New York",
DateOfBirth = DateTime.Parse("2020-01-01"),
IsActive = true,
DateInsertedUtc = DateTime.UtcNow
};
var id = connection.Merge<Person>(person);
}By default, the primary column is used as a qualifier. You can override it by simply passing the list of fields in the qualifiers argument.
using (var connection = new SqlConnection(connectionString))
{
var person = new Person
{
Id = 10045,
Name = "John Doe",
Address = "New York",
DateOfBirth = DateTime.Parse("2020-01-01"),
IsActive = true,
DateInsertedUtc = DateTime.UtcNow
};
var id = connection.Merge<Person>(person,
qualifiers: (p => new { p.Name, p.DateOfBirth }));
}{: .important }
The result will vary from the value of the
GlobalConfiguration.Optionsproperty KeyColumnReturnBehavior.
You can also target a specific table by passing the literal table like below.
using (var connection = new SqlConnection(connectionString))
{
var person = new Person
{
Id = 10045,
Name = "John Doe",
Address = "New York",
DateOfBirth = DateTime.Parse("2020-01-01"),
IsActive = true,
DateInsertedUtc = DateTime.UtcNow
};
var id = connection.Merge<Person>("[dbo].[Person]",
entity: person);
}Or via Anonymous Type.
using (var connection = new SqlConnection(connectionString))
{
var person = new
{
Id = 10045,
Name = "John Doe",
Address = "New York",
DateOfBirth = DateTime.Parse("2020-01-01"),
IsActive = true,
DateInsertedUtc = DateTime.UtcNow
};
var id = connection.Merge("[dbo].[Person]",
entity: person);
}Or via Dictionary<string, object> or ExpandoObject.
using (var connection = new SqlConnection(connectionString))
{
var person = new Dictionary<string, object>
{
{ "Id", 10045 },
{ "Name", "John Doe" },
{ "Address", "New York" },
{ "DateOfBirth", DateTime.Parse("2020-01-01") },
{ "IsActive", true },
{ "CreatedDateUtc", DateTime.UtcNow }
};
var id = connection.Merge("[dbo].[Customer]",
entity: person);
}{: .note }
The library will add the newly created value of the identity column into the
Dictionary<string, object>or ExpandoObject object (if not present).
You can also target a specific columns to be merged by passing the list of fields to be included in the fields argument.
using (var connection = new SqlConnection(connectionString))
{
var person = new Person
{
Id = 10045,
Name = "John Doe",
Address = "New York",
DateOfBirth = DateTime.Parse("2020-01-01"),
IsActive = true,
DateInsertedUtc = DateTime.UtcNow
};
var fields = Field.Parse<Person>(e => new
{
e.Name,
e.DateOfBirth,
e.DateInsertedUtc
})
var id = connection.Merge<Person>(entity: person,
fields: fields);
}Or via dynamics.
using (var connection = new SqlConnection(connectionString))
{
var person = new
{
Id = 10045,
Name = "John Doe",
Address = "New York",
DateOfBirth = DateTime.Parse("2020-01-01"),
IsActive = true,
DateInsertedUtc = DateTime.UtcNow
};
var id = connection.Merge("[dbo].[Person]",
entity: person,
fields: Field.From("Name", "DateOfBirth", "DateInsertedUtc"));
}To pass a hint, simply write the table-hints and pass it in the hints argument.
using (var connection = new SqlConnection(connectionString))
{
var id = connection.Merge<Person>(person,
hints: "WITH (TABLOCK)");
}Or, you can use the SqlServerTableHints class.
using (var connection = new SqlConnection(connectionString))
{
var id = connection.Merge<Person>(person,
hints: SqlServerTableHints.TabLock);
}