private static void CorrectUseToList(AdsEntities context)
 {
     context.Database.SqlQuery<string>("CHECKPOINT");
     context.Database.SqlQuery<string>("DBCC DROPCLEANBUFFERS"); //clean SQL Server caches
     var correctToList = context.Ads
         .OrderBy(a => a.Date)
         .Where(a => a.AdStatus.Status == "Published")
         .Select(a => new
         {
             a.Title,
             Category = a.Category != null ? a.Category.Name : "no category",
             Town = a.Town != null ? a.Town.Name : "no town"
         })
         .ToList();
 }
        static void Main()
        {
            var context = new AdsEntities();
            //Problem 1.Show Data from Related Tables

            //Using Entity Framework write a SQL query to select all ads from the database and later print
            //their title, status, category, town and user. Do not use Include(…) for the relationships of the Ads.
            var adsWithoutInclude = context.Ads;
            foreach (var ad in adsWithoutInclude)
            {
                var title = ad.Title;
                var status = ad.AdStatus.Status;
                var category = ad.Category != null ? ad.Category.Name : "no category"; //за тези колони (пропъртита), които е позволено да са NULL, трябва да се направи проверка иначе хвърля ексепшън
                var town = ad.Town != null ? ad.Town.Name : "no town";
                var user = ad.AspNetUser.UserName;
                Console.WriteLine("{0}; {1}; {2}; {3}; {4}",
                                    title, status, category, town, user);
            }
            Console.WriteLine();

            //Add Include(…) to select statuses, categories, towns and users along with all ads.
            var adsWithInclude = context.Ads
                .Include(a => a.AdStatus)
                .Include(a => a.Category)
                .Include(a => a.Town)
                .Include(a => a.AspNetUser);
            foreach (var ad in adsWithInclude)
            {
                var title = ad.Title;
                var status = ad.AdStatus.Status;
                var category = ad.Category != null ? ad.Category.Name : "no category"; //за тези пропъртита, които е позволено да са NULL, трябва да се направи проверка иначе хвърля ексепшън
                var town = ad.Town != null ? ad.Town.Name : "no town";
                var user = ad.AspNetUser.UserName;
                Console.WriteLine("{0}; {1}; {2}; {3}; {4}",
                                    title, status, category, town, user);
            }
            Console.WriteLine();

            //Problem 2. Play with ToList()

            //Using Entity Framework select all ads from the database, then invoke ToList(),
            //then filter the categories whose status is Published; then select the ad title, category and town,
            //then invoke ToList() again and finally order the ads by publish date.
            //Rewrite the same query in a more optimized way
            //Compare the execution time of the two programs. Hint: use the System.Diagnostics.Stopwatch class.
            //Run each program 10 times and write the average performance time

            Stopwatch stopwatch = new Stopwatch(); // Create new stopwatch
            for (int i = 0; i < 10; i++)
            {
                stopwatch.Start();  // Begin timing
                IncorrectUseToList(context);    // Do something
                stopwatch.Stop();   // Stop timing
                Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);  // Write result
            }
            Console.WriteLine();
            stopwatch.Restart();

            for (int i = 0; i < 10; i++)
            {
                stopwatch.Start();  // Begin timing
                CorrectUseToList(context);    // Do something
                stopwatch.Stop();   // Stop timing
                Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);  // Write result
            }

            //Problem 3. Select Everything vs. Select Certain Columns

            //Write a program to compare the execution speed between these two scenarios:
            //Select everything from the Ads table and print only the ad title.
            //Select the ad title from Ads table and print it.

            Stopwatch stopwatch2 = new Stopwatch(); // Create new stopwatch
            for (int i = 0; i < 10; i++)
            {
                stopwatch2.Start();  // Begin timing
                SelectEverything(context);    // Do something
                stopwatch2.Stop();   // Stop timing
                Console.WriteLine("Time elapsed: {0}", stopwatch2.Elapsed);  // Write result
            }
            Console.WriteLine();
            stopwatch2.Restart();

            for (int i = 0; i < 10; i++)
            {
                stopwatch2.Start();  // Begin timing
               SelectCertainColumns(context);    // Do something
                stopwatch2.Stop();   // Stop timing
                Console.WriteLine("Time elapsed: {0}", stopwatch2.Elapsed);  // Write result
            }
        }
 private static void SelectEverything(AdsEntities context)
 {
     context.Database.SqlQuery<string>("CHECKPOINT");
     context.Database.SqlQuery<string>("DBCC DROPCLEANBUFFERS"); //clean SQL Server caches
     var ads = context.Ads;
     foreach (var ad in ads)
     {
         Console.WriteLine(ad.Title);
     }
 }
 private static void SelectCertainColumns(AdsEntities context)
 {
     var ads = context.Ads
         .Select(a => a.Title);
     foreach (var ad in ads)
     {
         Console.WriteLine(ad);
     }
 }