using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Collections.Generic;
public static void Main()
AddEntity(new Articolo(){Nome="articolo1"},db);
AddEntity(new Articolo(){Nome="articolo2"},db);
AddEntity(new Ordine(){Numero=1},db);
AddEntity(new Ordine(){Numero=2},db);
Console.WriteLine("Query 1 (articoli)");
db.Base.Local.Where(w=>w.Data>=data&&w.Data<data.AddSeconds(1)).ToList().ForEach(f=> Console.WriteLine($"Data:{f.Data}, Tipo:{f.GetType().Name}, TargetProperty:{f.GetTargetProperty()}"));
Console.WriteLine("Query 2 (tutti)");
db.Base.Local.Where(w=>w.Data>=data).ToList().ForEach(f=>Console.WriteLine($"Data:{f.Data}, Tipo:{f.GetType().Name}, TargetProperty:{f.GetTargetProperty()}"));
Console.WriteLine("Query 3 (ordini)");
db.Base.Local.Where(w=>w.Data>=data.AddSeconds(2)).ToList().ForEach(f=>Console.WriteLine($"Data:{f.Data}, Tipo:{f.GetType().Name}, TargetProperty:{f.GetTargetProperty()}"));
public static void AddEntity<T>(T entity, DB db) where T : Entity
entity.Data = DateTime.Now;
public class DB : DbContext
protected override void OnConfiguring(DbContextOptionsBuilder options)
options.UseSqlite("Data Source=:memory:");
public DbSet<Entity> Base {get;set;}
public DbSet<Articolo> Articoli {get;set;}
public DbSet<Ordine> Ordini {get;set;}
public DateTime Data {get;set;}
public virtual dynamic GetTargetProperty(){return this.Data;}
public virtual void SetTargetProperty(dynamic value){this.Data=value;}
public class Articolo: Entity
public string Nome {get;set;}
public int? OrdineId { get; set; }
public Ordine Ordine { get; init; }
public class Ordine : Entity
public int Numero {get;set;}
public int? ClienteId { get; set; }
public Cliente Cliente { get; init; }
public List<Articolo> Articoli { get; } = new();
public override dynamic GetTargetProperty(){return this.Numero;}
public override void SetTargetProperty(dynamic value){this.Numero=value;}
public class Cliente : Entity
public string Indirizzo {get;set;}
public string Nome {get;set;}
public List<Ordine> Ordini { get; } = new();
public override dynamic GetTargetProperty(){return this.Nome;}
public override void SetTargetProperty(dynamic value){this.Nome=value;}