EF Extensions - WhereBulkContains - Generic Type

CSharp · Console

/Program.cs

// Entity Framework Extensions
// Doc: https://entityframework-extensions.net/where-bulk-contains

// @nuget: Newtonsoft.Json
// @nuget: Microsoft.EntityFrameworkCore.SqlServer
// @nuget: Z.EntityFramework.Extensions.EFCore

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
					
public class Program
{
	public static void Main()
	{
		// Doc: https://entityframework-extensions.net/where-bulk-contains

		SeedDatabase();
		var deserializedCustomers = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Customer>>(GetSerializedCustomers());
		FiddleHelper.WriteTable("1 - DeserializedCustomers", deserializedCustomers);

		using (var context = new EntityContext())
		{
			// You can specify a custom `JOIN` clause with one or many properties using a `Lambda Expression`
			var customers = GetFromGenericContains(deserializedCustomers);
			FiddleHelper.WriteTable("3 - WhereBulkNotContains + Lambda Expression", customers);
		}
	}
	
	public static List<T> GetFromGenericContains<T>(List<T> items) where T : class
	{
		using (var context = new EntityContext())
		{
			return context.Set<T>().WhereBulkContains(items,  new List<string> { "Code" }).ToList();
		}
	}
	
	public static void SeedDatabase()
	{
		using (var context = new EntityContext())
		{
			var list = new List<Customer>();

			for (int i = 0; i < 5; i++)
			{
				list.Add(new Customer() { Code = "Original_" + i, Email = "Original_" + i, FirstName = "Original_" + i, LastName = "Original_" + i });
			}

			context.BulkInsert(list);
		}
	}

	public static string GetSerializedCustomers()
	{
		var customers = new List<Customer>();

		for (int i = 0; i < 3; i++)
		{
			customers.Add(new Customer() { CustomerID = i + 1, Code = "Original_" + i, Email = "Updated_" + i, FirstName = "Updated_" + i, LastName = "Updated_" + i });
		}

		return JsonConvert.SerializeObject(customers);
	}

	public class EntityContext : DbContext
	{
		static EntityContext()
		{
			using (var context = new EntityContext())
			{
				context.Database.EnsureCreated();
			}
		}
		
		public DbSet<Customer> Customers { get; set; }

		protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
		{
			optionsBuilder.UseSqlServer(new SqlConnection(FiddleHelper.GetConnectionStringSqlServer()));

			base.OnConfiguring(optionsBuilder);
		}
	}

	[Table("Customer")]
	public class Customer
	{
		public int CustomerID { get; set; }
		public string Code { get; set; }
		public string Email { get; set; }
		public string FirstName { get; set; }
		public string LastName { get; set; }
	}
}
;