N.EntityFrameworkCore.Extensions extends your DbContext with high-performance bulk operations: BulkDelete, BulkFetch, BulkInsert, BulkMerge, BulkSaveChanges, BulkSync, BulkUpdate, Fetch, FromSqlQuery, DeleteFromQuery, InsertFromQuery, UpdateFromQuery, QueryToCsvFile, SqlQueryToCsvFile
Supports: Multiple Schemas, Complex Properties, Value Converters, Transactions, Synchronous & Asynchronous Execution
Inheritance Models: Table-Per-Concrete, Table-Per-Hierarchy, Table-Per-Type
Supports Databases: SQL Server
The latest stable version is available on NuGet.
dotnet add package N.EntityFrameworkCore.ExtensionsBulkInsert() - Performs an insert operation with a large number of entities
var dbContext = new MyDbContext();
var orders = new List<Order>();
for(int i=0; i<10000; i++)
{
orders.Add(new Order { OrderDate = DateTime.UtcNow, TotalPrice = 2.99 });
}
dbContext.BulkInsert(orders);
BulkDelete() - Performs a delete operation with a large number of entities
var dbContext = new MyDbContext();
var orders = dbContext.Orders.Where(o => o.TotalPrice < 5.35M);
dbContext.BulkDelete(orders);
BulkFetch() - Retrieves entities that are contained in a list
var ids = new List<int> { 10001, 10002, 10003, 10004, 10005 };
var products = dbContext.Products.BulkFetch(ids, options => { options.JoinOnCondition = (s, t) => s.Id == t.Id; }).ToList();
BulkUpdate() - Performs an update operation with a large number of entities
var dbContext = new MyDbContext();
var products = dbContext.Products.Where(o => o.Price < 5.35M);
foreach(var product in products)
{
order.Price = 6M;
}
dbContext.BulkUpdate(products);
BulkMerge() - Performs a merge operation with a large number of entities
var dbContext = new MyDbContext();
var products = new List<Product>();
var existingProducts = dbContext.Products.Where(o => o.Price < 5.35M);
foreach(var product in existingProducts)
{
product.Price = 6M;
}
products.AddRange(existingProducts);
products.Add(new Product { Name="Hat", Price=10.25M });
products.Add(new Product { Name="Shirt", Price=20.95M });
dbContext.BulkMerge(products);
BulkSaveChanges() - Saves all changes using bulk operations
var dbContext = new MyDbContext();
var orders = new List<Order>();
for(int i=0; i<10000; i++)
{
orders.Add(new Order { Id=-i,OrderDate = DateTime.UtcNow, TotalPrice = 2.99 });
}
dbContext.Orders.AddRange(orders);
dbContext.BulkSaveChanges();
BulkSync() - Performs a sync operation with a large number of entities.
By default any entities that do not exists in the source list will be deleted, but this can be disabled in the options.
var dbContext = new MyDbContext();
var products = new List<Product>();
var existingProducts = dbContext.Products.Where(o => o.Id <= 1000);
foreach(var product in existingProducts)
{
product.Price = 6M;
}
products.AddRange(existingProducts);
products.Add(new Product { Name="Hat", Price=10.25M });
products.Add(new Product { Name="Shirt", Price=20.95M });
//All existing products with Id > 1000 will be deleted
dbContext.BulkSync(products);
Fetch() - Retrieves data in batches.
var dbContext = new MyDbContext();
var query = dbContext.Products.Where(o => o.Price < 5.35M);
query.Fetch(result =>
{
batchCount++;
totalCount += result.Results.Count();
},
new FetchOptions { BatchSize = 1000 }
);
dbContext.BulkUpdate(products);
DeleteFromQuery() - Deletes records from the database using a LINQ query without loading data into DbContext
var dbContext = new MyDbContext();
//This will delete all products
dbContext.Products.DeleteFromQuery()
//This will delete all products that are under $5.35
dbContext.Products.Where(x => x.Price < 5.35M).DeleteFromQuery()
InsertFromQuery() - Inserts records from the database using a LINQ query without loading data into DbContext
var dbContext = new MyDbContext();
//This will take all products priced under $10 from the Products table and
//insert it into the ProductsUnderTen table
dbContext.Products.Where(x => x.Price < 10M).InsertFromQuery("ProductsUnderTen", o => new { o.Id, o.Price });
UpdateFromQuery() - Updates records from the database using a LINQ query without loading data into DbContext
var dbContext = new MyDbContext();
//This will change all products priced at $5.35 to $5.75
dbContext.Products.Where(x => x.Price == 5.35M).UpdateFromQuery(o => new Product { Price = 5.75M })
Transaction
When using any of the following bulk data operations (BulkDelete, BulkInsert, BulkMerge, BulkSaveChanges, BulkSync, BulkUpdate, DeleteFromQuery, InsertFromQuery), if an external transaction exists, then it will be utilized.
var dbContext = new MyDbContext();
var transaction = context.Database.BeginTransaction();
try
{
dbContext.BulkInsert(orders);
transaction.Commit();
}
catch
{
transaction.Rollback();
}
| Name | Description |
|---|---|
| BulkDelete | |
| BulkDelete(items) | Bulk delete entities in your database. |
| BulkDelete(items, options) | Bulk delete entities in your database. |
| BulkDeleteAsync(items) | Bulk delete entities asynchronously in your database. |
| BulkDeleteAsync(items, cancellationToken) | Bulk delete entities asynchronously in your database. |
| BulkDeleteAsync(items, options) | Bulk delete entities asynchronously in your database. |
| BulkDeleteAsync(items, options, cancellationToken) | Bulk delete entities asynchronously in your database. |
| BulkFetch | |
| BulkFetch(items) | Retrieve entities that are contained in the items list. |
| BulkFetch(items, options) | Retrieve entities that are contained in the items list. |
| BulkFetchAsync(items) | Retrieve entities that are contained in the items list. |
| BulkFetchAsync(items, options) | Retrieve entities that are contained in the items list. |
| BulkInsert | |
| BulkInsert(items) | Bulk insert entities in your database. |
| BulkInsert(items, options) | Bulk insert entities in your database. |
| BulkInsertAsync(items) | Bulk insert entities asynchronously in your database. |
| BulkInsertAsync(items, cancellationToken) | Bulk insert entities asynchronously in your database. |
| BulkInsertAsync(items, options) | Bulk insert entities asynchronously in your database. |
| BulkInsertAsync(items, options, cancellationToken) | Bulk insert entities asynchronously in your database. |
| BulkMerge | |
| BulkMerge(items) | Bulk merge entities in your database. |
| BulkMerge(items, options) | Bulk merge entities in your database. |
| BulkMergeAsync(items) | Bulk merge entities asynchronously in your database. |
| BulkMergeAsync(items, cancellationToken) | Bulk merge entities asynchronously in your database. |
| BulkMergeAsync(items, options) | Bulk merge entities asynchronously in your database. |
| BulkMergeAsync(items, options, cancellationToken) | Bulk merge entities asynchronously in your database. |
| BulkSaveChanges | |
| BulkSaveChanges() | Save changes using high-performance bulk operations. Should be used instead of SaveChanges(). |
| BulkSaveChanges( acceptAllChangesOnSave) | Save changes using high-performance bulk operations. Should be used instead of SaveChanges(). |
| BulkSaveChangesAsync() | Save changes using high-performance bulk operations. Should be used instead of SaveChanges(). |
| BulkSaveChangesAsync( acceptAllChangesOnSave, cancellationToken) | Save changes using high-performance bulk operations. Should be used instead of SaveChanges(). |
| BulkSync | |
| BulkSync(items) | Bulk sync entities in your database. |
| BulkSync(items, options) | Bulk sync entities in your database. |
| BulkSyncAsync(items) | Bulk sync entities asynchronously in your database. |
| BulkSyncAsync(items, cancellationToken) | Bulk sync entities asynchronously in your database. |
| BulkSyncAsync(items, options) | Bulk sync entities asynchronously in your database. |
| BulkSyncAsync(items, options, cancellationToken) | Bulk sync entities asynchronously in your database. |
| BulkUpdate | |
| BulkUpdate(items) | Bulk update entities in your database. |
| BulkUpdate(items, options) | Bulk update entities in your database. |
| BulkUpdateAsync(items) | Bulk update entities asynchronously in your database. |
| BulkUpdateAsync(items, cancellationToken) | Bulk update entities asynchronously in your database. |
| BulkUpdateAsync(items, options) | Bulk update entities asynchronously in your database. |
| BulkUpdateAsync(items, options, cancellationToken) | Bulk update entities asynchronously in your database. |
| DeleteFromQuery | |
| DeleteFromQuery() | Deletes all rows from the database using a LINQ query without loading in context |
| DeleteFromQueryAsync() | Deletes all rows from the database using a LINQ query without loading in context using asynchronous task |
| DeleteFromQueryAsync(cancellationToken) | Deletes all rows from the database using a LINQ query without loading in context using asynchronous task |
| InsertFromQuery | |
| InsertFromQuery(tableName, selectExpression) | Insert all rows from the database using a LINQ query without loading in context |
| InsertFromQueryAsync(tableName, selectExpression) | Insert all rows from the database using a LINQ query without loading in context using asynchronous task |
| InsertFromQueryAsync(tableName, selectExpression, cancellationToken) | Insert all rows from the database using a LINQ query without loading in context using asynchronous task |
| UpdateFromQuery | |
| UpdateFromQuery(updateExpression) | Updates all rows from the database using a LINQ query without loading in context |
| UpdateFromQueryAsync(updateExpression) | Updates all rows from the database using a LINQ query without loading in context using asynchronous task |
| UpdateFromQueryAsync(updateExpression, cancellationToken) | Updates all rows from the database using a LINQ query without loading in context using asynchronous task |
| Fetch | |
| Fetch(fetchAction) | Fetch rows in batches from the database using a LINQ query |
| Fetch(fetchAction, options) | Fetch rows in batches from the database using a LINQ query |
| FetchAsync(fetchAction) | Fetch rows asynchronously in batches from the database using a LINQ query |
| FetchAsync(fetchAction, options) | Fetch rows asynchronously in batches from the database using a LINQ query |
| FetchAsync(fetchAction, cancellationToken) | Fetch rows asynchronously in batches from the database using a LINQ query |
| FetchAsync(fetchAction, options, cancellationToken) | Fetch rows asynchronously in batches from the database using a LINQ query |
If you found this project helpful and you would like to support it, feel free to donate through paypal or bitcoin.
| Paypal | Bitcoin |
|---|---|
![]() |
![]() bc1qxqpymnf4gj22nt4wj3wy56ks48fw59v8y9sg9z |

