public SampleBrowserViewModel(
            [ImportMany] IEnumerable<Lazy<SampleBase, ISampleMetadata>> samples,
			[ImportMany] IEnumerable<Lazy<TechDemoViewModel, ITechDemoMetadata>> techDemos)
		{
		    DisplayName = "Sample Browser";

		    _categories = new[]
		    {
                new SampleCategoryViewModel("Samples", samples.OrderBy(x => x.Metadata.SortOrder).Select(x => new SampleViewModel(x.Value))), 
                new SampleCategoryViewModel("Tech Demos", techDemos.OrderBy(x => x.Metadata.SortOrder).Select(x => x.Value))
		    };
            _selectedCategory = _categories[0];
		}
        public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "samples")]
            HttpRequestMessage req,
            [Table(Constants.SamplesTableName)] CloudTable table,
            TraceWriter log,
            CancellationToken ct)
        {
            var categoriesQuery = table
                                  .CreateQuery <SampleCategory>()
                                  .Where(cat => cat.PartitionKey.Equals(nameof(SampleCategory)) && !cat.RowKey.Equals(Constants.DefaultCategoryIdForSaving))
                                  .AsTableQuery()
                                  .SelectColumn(nameof(SampleCategory.Title));

            var categories = (await table.ExecuteQuery(categoriesQuery, ct))
                             .OrderBy(cat => cat.ListingOrder)
                             .ThenBy(cat => cat.Title)
                             .ThenBy(cat => cat.Id)
                             .ToArray();

            var result = new List <SampleCategoryViewModel>(categories.Length);

            var etagSb = new StringBuilder();

            etagSb.Append('"');

            foreach (var category in categories)
            {
                var samplesQuery = table
                                   .CreateQuery <Sample>()
                                   .Where(smpl => smpl.PartitionKey.Equals(nameof(Sample)) && smpl.Category.Equals(category.Id))
                                   .AsTableQuery()
                                   .SelectColumn(nameof(Sample.Category))
                                   .SelectColumn(nameof(Sample.Title))
                                   .SelectColumn(nameof(Sample.Description))
                                   .SelectColumn(nameof(Sample.Keywords));

                var samples = (await table.ExecuteQuery(samplesQuery, ct))
                              .OrderBy(cat => cat.ListingOrder)
                              .ThenBy(cat => cat.Title)
                              .ThenBy(cat => cat.Id)
                              .ToArray();

                var categoryVm = new SampleCategoryViewModel(category, samples);
                result.Add(categoryVm);
                etagSb.Append(categoryVm.SamplesHash.ToString("X"));
            }

            etagSb.Append('"');

            var etag = etagSb.ToString();

            if (req.Headers.IfMatch.Any(im => im.Tag.Equals(etag, StringComparison.OrdinalIgnoreCase)))
            {
                return(req.CreateResponse(HttpStatusCode.NotModified));
            }

            var response = req.CreateResponse(HttpStatusCode.OK, result.ToArray());

            response.Headers.CacheControl =
                new CacheControlHeaderValue
            {
                NoCache        = false,
                Private        = false,
                MaxAge         = TimeSpan.FromHours(0.5),
                MustRevalidate = false,
                NoStore        = false,
                NoTransform    = true,
                MaxStale       = true
            };
            response.Headers.ETag = new EntityTagHeaderValue(etag, false);

            return(response);
        }