INSERT
exampleIn SQL, INSERT
requires an ad-hoc specification of columns to insert to. There is a similar concept in C# - value tuple.
ELINQ defines an extension method - @using()
that accepts a tuple. The returned object has several RowXXX()
overloads to create VALUES
parameters in a type-safe way.
var name = "2018 Summer Promotion";
var discount = 0.15M;
var startDate = "20180601";
var expiredDate = "20180901";
var rows = DbContext.Database.Execute((Promotions promo) =>
{
var set = promo.@using((promo.PromotionName, promo.Discount, promo.StartDate, promo.ExpiredDate));
INSERT().INTO(set);
VALUES(set.Row((name, discount, DataTypes.DATE.Raw(startDate), DataTypes.DATE.Raw(expiredDate))));
});
Console.WriteLine($"{rows} rows affected");
Insert a row from an object:
Promotions newPromo = new Promotions()
{
PromotionName = "2018 Summer Promotion",
Discount = 0.15M,
StartDate = new DateTime(2018, 06, 01),
ExpiredDate = new DateTime(2018, 09, 01)
};
var rows = DbContext.Database.Execute((Promotions promo) =>
{
var set = promo.@using((promo.PromotionName, promo.Discount, promo.StartDate, promo.ExpiredDate));
INSERT().INTO(set);
VALUES(set.RowFrom(newPromo));
});
Console.WriteLine($"{rows} rows affected");
We can also override properties from the passed object by passing additional parameters to the RowFrom()
method. In the next example discount
will be inserted with DEFAULT
:
var rows = DbContext.Database.Execute((Promotions promo) =>
{
var set = promo.@using((promo.PromotionName, promo.StartDate, promo.ExpiredDate, promo.Discount));
INSERT().INTO(set);
VALUES(set.RowFrom(newPromo, DEFAULT()));
});
Console.WriteLine($"{rows} rows affected");
var query = DbContext.Promotions.Query((Promotions promo) =>
{
var set = promo.@using((promo.PromotionName, promo.Discount, promo.StartDate, promo.ExpiredDate));
INSERT().INTO(set);
var r = OUTPUT(INSERTED<Promotions>());
VALUES(set.RowFrom(newPromo));
return r;
});
foreach (var promo in query)
Console.WriteLine((promo.PromotionId, promo.PromotionName, promo.Discount, promo.StartDate, promo.ExpiredDate));