private GovernorateViewModel GetGridAsDataTable(int[] regionsandgov, int[] years, int[] activities, string lang)
        {
            List <List <object> > dataRows  = new List <List <object> >();
            DataTable             dataTable = new DataTable();

            //default Columns
            dataTable.Columns.Add("DFIndicatorId");
            dataTable.Columns.Add("Unit");
            dataTable.Columns.Add("DFGovernorateId");
            dataTable.Columns.Add("DFRegions");
            dataTable.Columns.Add("DFYearId");

            List <string> headers = new List <string>();

            //default headers
            headers.Add("DFIndicatorId");
            headers.Add("Unit");
            headers.Add("DFGovernorateId");
            headers.Add("DFRegions");
            headers.Add("DFYearId");

            //add Columns and headers sent by activities ids
            _db.DFSectors.OrderBy(x => x.Order ?? 0).Where(x => activities.Contains(x.Id)).ToList().ForEach(item =>
            {
                dataTable.Columns.Add(item.Name);
                headers.Add(item.Name);
            });

            //get Governorates filterd by regionsandgov and years
            var query = _db.Governorates.Include(x => x.DFGovernorate.DFRegion).Include(x => x.DFGovernorate).Include(x => x.DFYear).Include(x => x.DFIndicator)
                        .Where(x => !(x.isDeleted ?? false) &&
                               (years.Length == 0 || years.Contains(x.DFYear.Id)) &&
                               (regionsandgov.Length == 0 || regionsandgov.Contains(x.DFGovernorate.Id))
                               ).OrderByDescending(x => x.DFYearId).ToList();

            if (lang == null || lang.ToLower() == "ar")
            {
                query.ForEach(x =>
                {
                    List <object> row = new List <object>();
                    //put values to corresponding headers
                    foreach (var item in headers)
                    {
                        switch (item)
                        {
                        case "DFIndicatorId":
                            row.Add(x.DFIndicator.GetType().GetProperty("NameAr").GetValue(x.DFIndicator, null).ToString());
                            break;

                        //todo:unit forigen key
                        case "Unit":
                            row.Add("الف جنيه");
                            break;

                        case "DFGovernorateId":
                            row.Add(x.DFGovernorate.GetType().GetProperty("NameAr").GetValue(x.DFGovernorate, null).ToString());
                            break;

                        case "DFRegions":
                            row.Add(x.DFGovernorate.DFRegion.GetType().GetProperty("NameAr").GetValue(x.DFGovernorate.DFRegion, null).ToString());
                            break;

                        case "DFYearId":
                            row.Add(x.DFYear.GetType().GetProperty("NameAr").GetValue(x.DFYear, null).ToString());
                            break;


                        default:
                            var obj = x.GetType().GetProperty(item).GetValue(x, null);
                            //row.Add(obj != null ? obj.ToString() : "N/A");
                            double num;
                            var numFlag = double.TryParse("" + obj, out num);
                            if (numFlag)
                            {
                                num = Math.Round(num, 2);
                                row.Add(num);
                            }
                            else
                            {
                                row.Add(obj != null ? obj : "N/A");
                            }
                            break;
                        }
                    }

                    dataRows.Add(row);
                });
            }
            else
            {
                query.ForEach(x =>
                {
                    List <object> row = new List <object>();
                    foreach (var item in headers)
                    {
                        switch (item)
                        {
                        case "DFIndicatorId":
                            row.Add(x.DFIndicator.GetType().GetProperty("NameEn").GetValue(x.DFIndicator, null).ToString());
                            break;

                        case "Unit":
                            row.Add(x.GetType().GetProperty("Unit").GetValue(x, null).ToString());
                            break;

                        case "DFGovernorateId":
                            row.Add(x.DFGovernorate.GetType().GetProperty("NameEn").GetValue(x.DFGovernorate, null).ToString());
                            break;

                        case "DFRegions":
                            row.Add(x.DFGovernorate.DFRegion.GetType().GetProperty("NameEn").GetValue(x.DFGovernorate.DFRegion, null).ToString());
                            break;

                        case "DFYearId":
                            row.Add(x.DFYear.GetType().GetProperty("NameEn").GetValue(x.DFYear, null).ToString());
                            break;


                        default:
                            var obj = x.GetType().GetProperty(item).GetValue(x, null);
                            double num;
                            var numFlag = double.TryParse("" + obj, out num);
                            if (numFlag)
                            {
                                num = Math.Round(num, 2);
                                row.Add(num);
                            }
                            else
                            {
                                row.Add(obj != null ? obj : "N/A");
                            }
                            break;
                        }
                    }

                    dataRows.Add(row);
                });
            }
            //get localize columns names
            headers = LocalizeColumnNames(headers, lang);

            GovernorateViewModel tableResult = new GovernorateViewModel(headers, dataRows);

            return(tableResult);
        }
        public GovernorateViewModel GetFilterdGovernoratesForGrid(int[] regionsandgov, int[] years, int[] activities, string lang)
        {
            GovernorateViewModel dataTable = GetGridAsDataTable(regionsandgov, years, activities, lang);

            return(dataTable);
        }