using System; using System.Linq; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; await using var connection = new SqliteConnection("Data Source=:memory:;Foreign Keys=True"); await connection.OpenAsync(); var options = new DbContextOptionsBuilder().UseSqlite(connection).Options; await using var db = new LabDb(options); await db.Database.EnsureCreatedAsync(); db.Items.AddRange(new Item { Name = "A", PriceCents = 150 }, new Item { Name = "B", PriceCents = 50 }, new Item { Name = "C", PriceCents = 200 }); await db.SaveChangesAsync(); db.ChangeTracker.Clear(); var query = db.Items.Where(x => x.PriceCents >= 100).OrderBy(x => x.Name).Select(x => new { x.Name, x.PriceCents }); Check(query.ToQueryString().Contains("WHERE", StringComparison.OrdinalIgnoreCase), "provider WHERE"); var rows = await query.ToListAsync(); Check(string.Join(",", rows.Select(x => x.Name)) == "A,C", "projected rows"); Check(!db.ChangeTracker.Entries().Any(), "scalar projection not tracked"); Console.WriteLine("rows:" + string.Join(",", rows.Select(x => x.Name))); Console.WriteLine("tracked:" + db.ChangeTracker.Entries().Count()); static void Check(bool condition, string name) { if (!condition) throw new InvalidOperationException("CHECK: " + name); }