N.EntityFramework.Extensions 1.9.1

dotnet add package N.EntityFramework.Extensions --version 1.9.1                
NuGet\Install-Package N.EntityFramework.Extensions -Version 1.9.1                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="N.EntityFramework.Extensions" Version="1.9.1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add N.EntityFramework.Extensions --version 1.9.1                
#r "nuget: N.EntityFramework.Extensions, 1.9.1"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install N.EntityFramework.Extensions as a Cake Addin
#addin nuget:?package=N.EntityFramework.Extensions&version=1.9.1

// Install N.EntityFramework.Extensions as a Cake Tool
#tool nuget:?package=N.EntityFramework.Extensions&version=1.9.1                

N.EntityFramework.Extensions

latest version downloads

**If you are using Entity Framework Core v8.0.0+ you can use https://github.com/NorthernLight1/N.EntityFrameworkCore.Extensions

Bulk data support for the EntityFramework 6.5.0+

Entity Framework 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, Transaction, Asynchronous Execution, Inheritance Models (Table-Per-Hierarchy, Table-Per-Concrete)

Supports Databases: SQL Server

Installation

The latest stable version is available on NuGet.

Install-Package N.EntityFramework.Extensions

Usage

BulkInsert() - Performs a 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);

//Using Options
dbContext.BulkInsert(orders, options =>
{
 options.CommandTimeout = 30;
 options.BatchSize = 100000;
 options.InsertIfNotExists = true;
 options.InsertOnCondition = (s, t) => s.ExternalId == t.ExternalId;
	options.KeepIdentity = true;
});  

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 a 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 in the context

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 in the context

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 in the context

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 }) 

Options

Transaction

When using any of the following bulk data operations (BulkDelete, BulkInsert, BulkMerge, 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();
}

Documentation

Name Description
BulkDelete
BulkDelete<T>(items) Bulk delete entities in your database.
BulkDelete<T>(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<T>(items) Retrieve entities that are contained in the items list.
BulkFetch<T>(items, options) Retrieve entities that are contained in the items list.
BulkFetchAsync<T>(items) Retrieve entities that are contained in the items list.
BulkFetchAsync<T>(items, options) Retrieve entities that are contained in the items list.
BulkInsert
BulkInsert<T>(items) Bulk insert entities in your database.
BulkInsert<T>(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.
BulkInsertOptions
AutoMapOutput Assigns the ouput of all database generated columns to the entities. Perfomance can be improved by disabling this option. (Default=true)
CommandTimeout Gets or sets the wait time (in seconds) before terminating the attempt.
IgnoreColumns columns that will be excluded.
IncludeColumns columns that will be include.
InsertIfNotExists Inserts data into the target table only if it doesn't already exist. (Default=false)
InsertOnCondition Gets or sets the join condition for inserting data. If this condition is null, then the primary key is used. (Default=null)
KeepIdentity Keeps the identity when inserting data into a table. (Default=false)
UsePermanentTable Uses a permanent table when inserting data. If a table uses Always Encrypt, a permanent table is required. (Default=false)
BulkMerge
BulkMerge<T>(items) Bulk merge entities in your database.
BulkMerge<T>(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<T>() Save changes using high-performance bulk operations. Should be used instead of SaveChanges().
BulkSaveChanges<T>( acceptAllChangesOnSave) Save changes using high-performance bulk operations. Should be used instead of SaveChanges().
BulkSaveChangesAsync<T>() Save changes using high-performance bulk operations. Should be used instead of SaveChanges().
BulkSaveChangesAsync<T>( acceptAllChangesOnSave, cancellationToken) Save changes using high-performance bulk operations. Should be used instead of SaveChanges().
BulkSync
BulkSync<T>(items) Bulk sync entities in your database.
BulkSync<T>(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<T>(items) Bulk update entities in your database.
BulkUpdate<T>(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, commandTimeout=null) Updates all rows from the database using a LINQ query without loading in context
UpdateFromQueryAsync(updateExpression, commandTimeout=null) Updates all rows from the database using a LINQ query without loading in context using asynchronous task
UpdateFromQueryAsync(updateExpression, commandTimeout=null, 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
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
.NET Framework net48 is compatible.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.9.1 2,839 9/6/2024
1.9.0 174 8/27/2024
1.8.4 13,879 6/8/2024
1.8.3 1,377 6/4/2024
1.8.2 336 5/28/2024
1.8.1 1,521 5/28/2024
1.8.0 24,272 2/29/2024
1.7.9 413 2/24/2024
1.7.8 5,377 12/17/2023
1.7.7 42,388 9/24/2023
1.7.3 78,252 11/12/2022