Example #1
0
        private static void PerformanceTest()
        {
            Console.WriteLine("Performance test");
            var customerIds = new IdGenerator();
            var orderIds    = new IdGenerator();

            using (var db = new MyDatabase())
            {
                for (int i = 0; i < 500; i++)
                {
                    var customer = db.Customers.Add(new Customer()
                    {
                        Id     = customerIds.Next(),
                        Name   = "Some name",
                        Orders = new List <Order>()
                    });
                    for (int j = 0; j < 3; j++)
                    {
                        customer.Orders.Add(new Order()
                        {
                            Id       = orderIds.Next(),
                            Customer = customer
                        });
                    }
                }
                db.SaveChanges();
            }

            ExecutePerformanceTest(customerIds, orderIds, "0% loaded", false);
            ExecutePerformanceTest(customerIds, orderIds, "0% loaded", true);
            ExecutePerformanceTest(customerIds, orderIds, "50% loaded", false, (db) =>
            {
                db.Customers.Take(customerIds.All().Count() / 2).ToArray();
                db.Orders.Take(orderIds.All().Count() / 2).ToArray();
            });
            ExecutePerformanceTest(customerIds, orderIds, "50% loaded", true, (db) =>
            {
                db.Customers.Take(customerIds.All().Count() / 2).ToArray();
                db.Orders.Take(orderIds.All().Count() / 2).ToArray();
            });
            ExecutePerformanceTest(customerIds, orderIds, "100% loaded", false, (db) => { db.Customers.Include(z => z.Orders).ToArray(); });
            ExecutePerformanceTest(customerIds, orderIds, "100% loaded", true, (db) => { db.Customers.Include(z => z.Orders).ToArray(); });
        }
Example #2
0
        private static void FunctionalTest()
        {
            Console.WriteLine("Functional test");

            {
                // Object can be retreived after adding it to the DbContext
                var customerIds = new IdGenerator();
                using (var db = new MyDatabase())
                {
                    var finder = new FasterFind(db);
                    db.Customers.Add(new Customer()
                    {
                        Id     = customerIds.Next(),
                        Name   = "Some name",
                        Orders = new List <Order>()
                    });
                    Debug.Assert(finder.Find <Customer>(customerIds.All().First()) != null);
                    Debug.Assert(finder.Find <Order>(customerIds.All().First()) == null);
                }
            }

            {
                // Object cannot be retreived after deleting it from the DbContext
                var customerIds = new IdGenerator();
                using (var db = new MyDatabase())
                {
                    var finder   = new FasterFind(db);
                    var customer = db.Customers.Add(new Customer()
                    {
                        Id     = customerIds.Next(),
                        Name   = "Some name",
                        Orders = new List <Order>()
                    });
                    db.SaveChanges();
                    db.Customers.Remove(customer);
                    Debug.Assert(finder.Find <Customer>(customerIds.All().First()) == null);
                    db.SaveChanges();
                    Debug.Assert(finder.Find <Customer>(customerIds.All().First()) == null);
                }
            }

            {
                // Nested Object can be retrieved
                var customerIds = new IdGenerator();
                var orderIds    = new IdGenerator();
                using (var db = new MyDatabase())
                {
                    var finder   = new FasterFind(db);
                    var customer = db.Customers.Add(new Customer()
                    {
                        Id     = customerIds.Next(),
                        Name   = "Some name",
                        Orders = new List <Order>()
                        {
                            new Order()
                            {
                                Id = orderIds.Next(),
                            }
                        }
                    });
                    Debug.Assert(finder.Find <Order>(orderIds.All().First()) != null);
                    db.SaveChanges();
                    Debug.Assert(finder.Find <Order>(orderIds.All().First()) != null);
                }
            }

            {
                // Nested Object can be retrieved - late bound
                // WARNING THIS IS THE ONLY USE-CASE THAT THIS
                // IMPLEMENTATION DOES NOT SUPPORT - UNLESS SAVED WITH SAVECHANGES
                var customerIds = new IdGenerator();
                var orderIds    = new IdGenerator();
                using (var db = new MyDatabase())
                {
                    var finder   = new FasterFind(db);
                    var customer = db.Customers.Add(new Customer()
                    {
                        Id     = customerIds.Next(),
                        Name   = "Some name",
                        Orders = new List <Order>()
                    });
                    customer.Orders.Add(new Order()
                    {
                        Customer = customer,
                        Id       = orderIds.Next(),
                    });
                    // This is the case where EF can find the object
                    // and our implementation cannot find it
                    // but EF is slow because of this 'only' case.
                    Debug.Assert(finder.Find <Order>(orderIds.All().First()) == null);
                    Debug.Assert(db.Orders.Find(orderIds.All().First()) != null);

                    db.SaveChanges();
                    Debug.Assert(finder.Find <Order>(orderIds.All().First()) != null);
                }
            }
        }