using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq.Dynamic.Core;
using System.Linq.Expressions;
public class Parcelamento
public int Id { get; set; }
public List<Parcela> Parcelas { get; set; }
public override string ToString()
var s = $"Parcelamento {Id}{Environment.NewLine}";
s += string.Join(Environment.NewLine, Parcelas.Select(p => p.ToString()));
public int ParcelamentoId { get; set; }
public int Id { get; set; }
public List<Debito> Debitos { get; set; }
public override string ToString()
var s = $" Parcela {Id}{Environment.NewLine}";
s += string.Join(Environment.NewLine, Debitos.Select(d => d.ToString()));
public int ParcelamentoId { get; set; }
public int ParcelaId { get; set; }
public int Id { get; set; }
public byte OrigemId { get; set; }
public override string ToString()
return $" Débito {Id}/{OrigemId}";
public class ParcelamentoContext : DbContext
public ParcelamentoContext(){ }
public ParcelamentoContext(DbContextOptions<ParcelamentoContext> options)
public DbSet<Parcelamento> Parcelamentos { get; set; }
public class ParcelamentoService
private ParcelamentoContext _context;
public ParcelamentoService(ParcelamentoContext context)
public void Add(int id, byte origemID)
var debito = new Debito { ParcelamentoId = id, ParcelaId = id * 2, Id = id * 3, OrigemId = origemID };
var parcela = new Parcela { ParcelamentoId = id, Id = id * 2, Debitos = new() { debito } };
var parcelamento = new Parcelamento { Id = id, Parcelas = new() { parcela } };
_context.Parcelamentos.Add(parcelamento);
public IEnumerable<Parcelamento> GetAll()
return _context.Parcelamentos
.Include(x => x.Parcelas)
.ThenInclude(x => x.Debitos)
public IEnumerable<Parcelamento> Find(List<byte> origens)
return _context.Parcelamentos
.Include(x => x.Parcelas)
.ThenInclude(x => x.Debitos)
.FilterOrigins(origens, p => p.Parcelas.SelectMany(p => p.Debitos).Select(d => d.OrigemId))
static void Main(string[] args)
Console.WriteLine("This is an example of using EF Core InMemory Database");
Console.WriteLine("======================================================");
var options = new DbContextOptionsBuilder<ParcelamentoContext>()
.UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
.ConfigureWarnings(x => x.Ignore(Microsoft.EntityFrameworkCore.Diagnostics.InMemoryEventId.TransactionIgnoredWarning))
using (var context = new ParcelamentoContext(options))
var service = new ParcelamentoService(context);
Console.WriteLine("Adding new Parcelamento");
context.Database.BeginTransaction();
context.Database.CommitTransaction();
Console.WriteLine("======================================================");
using (var context = new ParcelamentoContext(options))
var service = new ParcelamentoService(context);
var ps = service.GetAll();
var s = string.Join(Environment.NewLine + "----------------------------------" + Environment.NewLine, ps.Select(p => p.ToString()));
Console.WriteLine($"Parcelamentos: {s}");
Console.WriteLine("======================================================");
using (var context = new ParcelamentoContext(options))
var origens = new List<byte> { 2, 3};
var service = new ParcelamentoService(context);
var ps = service.Find(origens);
var s = string.Join(Environment.NewLine + "----------------------------------" + Environment.NewLine, ps.Select(p => p.ToString()));
Console.WriteLine($"Parcelamentos: {s}");
Console.WriteLine("Parcelamentos: Nenhum");
public static class QueryableExtension
public static IQueryable<TSource> FilterOrigins<TSource>(this IQueryable<TSource> source,
List<byte> sessionOrigins,
Expression<Func<TSource, IEnumerable<byte>>> checkOriginID) where TSource : class
if (sessionOrigins.Any())
var allOrigins = new List<byte> { 1, 2, 3, 4, 5 };
if (allOrigins.Except(sessionOrigins).Any())
return source.Where(x => checkOriginID.Compile().Invoke(x).All(o => sessionOrigins.Contains(o)));
return source.Where(x => false);