static void Main()
        {
            var db = new AdsEntities();
            var ads = db.Ads.ToList();

            // Variant 1.
            var starTime = DateTime.Now;
            var ads1 = db.Ads
                .First();

            var endTime = DateTime.Now;

            Console.WriteLine(endTime - starTime);

            // Variant 2.
            starTime = DateTime.Now;

            var ads2 = db.Ads
                .Select(a => a.Title)
                .First();

            endTime = DateTime.Now;

            Console.WriteLine(endTime - starTime);
        }
        public static void SelectEverything(AdsEntities context)
        {
            var testQuery = context.Ads.Select(a => a);

            foreach (var ad in testQuery)
            {
                Console.WriteLine(ad.Title);
            }
        }
        public static void SelectCertainColumn(AdsEntities context)
        {
            var testQuery = context.Ads.Select(a => a.Title);

            foreach (var ad in testQuery)
            {
                Console.WriteLine(ad);
            }
        }
 private static void Optimized(AdsEntities context)
 {
     var allAds = context.Ads
         .Where(a => a.AdStatus.Status == "Published")
         .OrderBy(a => a.Date)
         .Select(a => new
         {
             a.Title,
             Category = a.Category != null ? a.Category.Name : null,
             Town = a.Town != null ? a.Town.Name : null,
             a.Date
         });
 }
        static void Main()
        {
            var context = new AdsEntities();
            //This neutralize the first time connect to base that takes time
            context.Ads.Count();
            context.Database.ExecuteSqlCommand("CHECKPOINT");
            context.Database.ExecuteSqlCommand("DBCC DROPCLEANBUFFERS");

            double sum = 0;
            int runs = 1;

            var stopwatch = new Stopwatch();
            stopwatch.Start();

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Run #{0}", runs++);
                SelectEverything(context);
                double time = stopwatch.Elapsed.TotalSeconds;
                Console.WriteLine("----{0:F4}", time);
                sum += time;
            }

            Console.WriteLine("Average time non-optimized: {0:F4}", sum / 10);
            Console.WriteLine();

            runs = 1;
            double sum2 = 0;

            stopwatch.Restart();

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Run #{0}", runs++);
                SelectCertainColumn(context);
                double time = stopwatch.Elapsed.TotalSeconds;
                Console.WriteLine("----{0:F4}", time);
                sum2 += time;
            }

            Console.WriteLine("Average time optimized: {0:F4}", sum2 / 10);
        }
        static void Main()
        {
            var context = new AdsEntities();

            //Count of queries = 28
            foreach (var ad in context.Ads)
            {
                Console.WriteLine("{0} - {1} \n Category: {2} \n Town: {3} \n User: {4}\n",
                    ad.Title, ad.AdStatus, ad.Category, ad.Town, ad.AspNetUser);
            }

            //Count of queries = 1
            foreach (var ad in context.Ads
                .Include(a => a.AdStatus)
                .Include(a => a.Category)
                .Include(a => a.Town)
                .Include(a => a.AspNetUser))
            {
                Console.WriteLine("Ad Status: {0}\nCategory: {1}\nTown: {2}\nUser: {3}",
                    ad.AdStatus, ad.Category, ad.Town, ad.AspNetUser);
            }
        }
        static void Main()
        {
            var context = new AdsEntities();
            //This neutralize the first time connect to base that takes time
            context.Ads.Count();

            double sum = 0;
            int runs = 1;

            var stopwatch = new Stopwatch();
            stopwatch.Start();

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Run #{0}", runs++);
                NonOptimized(context);
                double time = stopwatch.Elapsed.TotalSeconds;
                Console.WriteLine("{0:F4}", time);
                sum += time;
            }
            Console.WriteLine("Average time non-optimized: {0:F4}", sum / 10);
            Console.WriteLine();

            runs = 1;
            double sum2 = 0;

            stopwatch.Restart();

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Run #{0}", runs++);
                Optimized(context);
                double time = stopwatch.Elapsed.TotalSeconds;
                Console.WriteLine("{0:F4}", time);
                sum2 += time;
            }

            Console.WriteLine("Average time optimized: {0:F4}", sum2 / 10);
        }
        static void Main()
        {
            var db = new AdsEntities();

            //// Variant 1. CountOfQueries = 1
            //var ads = db.Ads.Select(a => new
            //{
            //    a.Title,
            //    a.AdStatus,
            //    a.Category,
            //    a.Town,
            //    a.AspNetUser
            //});

            //foreach (var ad in ads)
            //{
            //    Console.WriteLine("{0} - {1} \n Category: {2}; Town: {3} \n User: {4}\n",
            //        ad.Title, ad.AdStatus, ad.Category, ad.Town, ad.AspNetUser);
            //}

            // Variant 2. CountOfQueries = 30
            foreach (var ad in db.Ads)
            {
                Console.WriteLine("{0} - {1} \n Category: {2}; Town: {3} \n User: {4}\n",
                    ad.Title, ad.AdStatus, ad.Category, ad.Town, ad.AspNetUser);
            }

            //// Variant 3. CountOfQueries = 1
            //foreach (var ad in db.Ads
            //    .Include(a => a.AdStatus)
            //    .Include(a => a.Town)
            //    .Include(a => a.Category)
            //    .Include(a => a.AspNetUser))
            //{
            //    Console.WriteLine("{0} - {1} \n Category: {2}; Town: {3} \n User: {4}\n",
            //        ad.Title, ad.AdStatus, ad.Category, ad.Town, ad.AspNetUser);
            //}
        }