DataTplTopProduct.cs
//
// This code is part of GrapeCity Documents for Word samples.
// Copyright (c) GrapeCity, Inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using GrapeCity.Documents.Word;

namespace GcWordWeb.Samples
{
    // This sample is similar to DataTplProductList but it sorts the product
    // list by price in the descending order to print 10 most expensive products.
    // To limit the list this sample uses the seq/follow formatter as a 'take(N)'
    // operator, utilizing also the ability to use multiple data sources.
    // The template document is modified to include the sequence/follow formatters.
    public class DataTplTopProduct
    {
        public GcWordDocument CreateDocx()
        {
            // The number of iterations:
            const int N = 10;

            // Load and modify the template DOCX:
            var doc = new GcWordDocument();
            doc.Load(Path.Combine("Resources", "WordDocs", "ProductListTemplate.docx"));
            var caption0 = "Product List";
            var caption1 = $"{N} Most Expensive Products";
            var pStart0 = @"{{#ds}}{{ds.ProductID}}";
            var pEnd0 = @"{{/ds}}";
            var pStart1 = @"{{#take}:seq(t10)}{{#ds}:follow(t10)}{{ds.ProductID}}";
            var pEnd1 = @"{{/ds}}{{/take}}";

            doc.Body.Replace(caption0, caption1);
            doc.Body.Replace(pEnd0, pEnd1);
            doc.Body.Replace(pStart0, pStart1);

            // Add a simple array to be used as the sequence data source
            // limiting the number of iterations over the "real" data range:
            doc.DataTemplate.DataSources.Add("take", new int[N]);

            using (var ds = new DataSet())
            {
                // Load the data and build the product list data source:
                ds.ReadXml(Path.Combine("Resources", "data", "GcNWind.xml"));

                DataTable dtProds = ds.Tables["Products"];
                DataTable dtSupps = ds.Tables["Suppliers"];

                var products =
                    from prod in dtProds.Select()
                    join supp in dtSupps.Select()
                    on prod["SupplierID"] equals supp["SupplierID"]
                    orderby prod["UnitPrice"] descending
                    select new
                    {
                        ProductID = prod["ProductID"],
                        ProductName = prod["ProductName"],
                        Supplier = supp["CompanyName"],
                        QuantityPerUnit = prod["QuantityPerUnit"],
                        UnitPrice = prod["UnitPrice"]
                    };

                // Add the data source to the data template data sources:
                doc.DataTemplate.DataSources.Add("ds", products);

                // The document already has all the necessary bindings,
                // so we only need to process the data template:
                doc.DataTemplate.Process();
            }

            // Done:
            return doc;
        }
    }
}