private static string ToXML(SalesReportsWrapper wrapper)
 {
     var serializer = new XmlSerializer(typeof(SalesReportsWrapper));
     using (var writer = new UTF8StringWriter())
     {
         var xsn = new XmlSerializerNamespaces();
         xsn.Add(string.Empty, string.Empty);
         serializer.Serialize(writer, wrapper, xsn);
         string xml = writer.ToString();
         return xml;
     }
 }
        public static async Task WriteXML(SalesReportsWrapper wrapper, string fileName)
        {
            if (wrapper == null)
            {
                throw new ArgumentNullException("Wrapper cannot be null");
            }

            using (var fileStream = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
            using (var streamWriter = new StreamWriter(fileStream))
            {
                string xml = ToXML(wrapper);
                await streamWriter.WriteAsync(xml);
            }
        }
        private async Task<SalesReportsWrapper> BuildSalesReports(DateTime startDate, DateTime endDate)
        {
            using (var context = new DatabaseManager.Data.SupermarketsContext())
            {
                var saleReportsQuery = from sale in context.Sales
                                       where sale.Date >= startDate
                                       where sale.Date <= endDate
                                       group new { sale.UnitPrice, sale.Date } by new { sale.Product.Vendor.Name } into salesGroup
                                       select new
                                       {
                                           Vendor = salesGroup.Key,
                                           Sales = from sale in salesGroup
                                                   group sale.UnitPrice by sale.Date into datesGroup
                                                   select new { Date = datesGroup.Key, TotalSum = datesGroup.Sum() }
                                       };

                var vendorGroups = await saleReportsQuery.ToArrayAsync();
                string monthFormat = @"MMM-yyyy";
                string currencyFormat = @"# ###.00";
                var salesReports = vendorGroups.Select(vg =>
                {
                    var summaries = vg.Sales.
                        Select(s => new Summary()
                        {
                            Date = s.Date.ToString(monthFormat),
                            TotalPrice = s.TotalSum.ToString(currencyFormat)
                        });
                    var salesReport = new SalesReport()
                        {
                            Vendor = vg.Vendor.Name,
                            Summaries = summaries.ToArray()
                        };
                    return salesReport;
                });
                var salesReportsWrapper =
                    new SalesReportsWrapper() { SaleReports = salesReports.ToArray() };
                return salesReportsWrapper;
            }
        }