Click here to Skip to main content
15,887,135 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
This is my code that works fine. When I try to initialize the var outside the if statement, the for loop gives all sorts of errors dependant on the way in which the var is initialized:
C#
[HttpPost]
        public FileResult ExportToCSV(string? listToExport)
        {
            // initialize with header
            string[] book = new string[] 
               { "Titel", "Auteur", "Hugo", "Nebula", "Locus" }; ;
            if (listToExport == "NTK")
            {
            var    Data = _context.Boek
                    .Include(b => b.Auteur)
                    .Include(b => b.Categorie)
                    .Where(b => b.CategorieID == 1 && 
                    b.ISBN == "0000000000" && (b.Hugo > 0 ||
                    b.Nebula > 0 || b.Locus > 0))
                    .Select
                    (b => new
                    {
                        titel = b.Titel,
                        auteur = b.Auteur!.DisplayName,
                        hugo = b.Hugo.ToString(),
                        nebula = b.Nebula.ToString(),
                        locus = b.Locus.ToString()
                    })
                   .ToList();
                StringBuilder sb = new StringBuilder();
                List<string[]> listData = 
                       new List<string[]>();
                //    listData = (List<string[]>)DataToExport;
                for (int i = 0; i < Data.Count; i++)
                {
                    // Data
                    book = new string[] { Data[i].titel!, 
                           Data[i].auteur!, Data[i].hugo, 
                           Data[i].nebula, Data[i].locus };
                for (int j = 0; j < book.Length; j++)
                {
                    //Append data with separator.
                    sb.Append(book[j] + ',');
                }

                //Append new line character.
                sb.Append("\r\n");
            }
           return File(Encoding.UTF8.GetBytes(sb.ToString()), 
                       "text/csv", "Boeken.csv");
            }
         else
            {
                return File("text/csv", "Boeken.csv");
            }
       }


What I have tried:

I tried all ways to initialize the var I found on the internet. Either the assignment of Data gives an error or the Data.Count in the for loop gives an error.
Posted
Updated 13-Sep-23 4:32am
v2

When you are initializing the 'Data' variable outside of the 'if' statement, it can cause issues because it depends on '_context' and other variables that are specific to your 'NTK' branch. Using the below code you are making sure that 'Data' only exists when needed and avoiding potential issues with null references or incorrect data when the condition is not met -
C#
[HttpPost]
public FileResult ExportToCSV(string? listToExport)
{
    //Initialize with header...
    string[] book = new string[] { "Titel", "Auteur", "Hugo", "Nebula", "Locus" };

    if (listToExport == "NTK")
    {
        //Initialize Data within the "NTK" branch...
        var Data = _context.Boek
            .Include(b => b.Auteur)
            .Include(b => b.Categorie)
            .Where(b => b.CategorieID == 1 && b.ISBN == "0000000000" && (b.Hugo > 0 || b.Nebula > 0 || b.Locus > 0))
            .Select(b => new
            {
                titel = b.Titel,
                auteur = b.Auteur!.DisplayName,
                hugo = b.Hugo.ToString(),
                nebula = b.Nebula.ToString(),
                locus = b.Locus.ToString()
            })
            .ToList();

        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < Data.Count; i++)
        {
            //Data...
            book = new string[] { Data[i].titel!, Data[i].auteur!, Data[i].hugo, Data[i].nebula, Data[i].locus };
            
            for (int j = 0; j < book.Length; j++)
            {
                //Append data with separator...
                sb.Append(book[j] + ',');
            }

            //Append new line character...
            sb.Append("\r\n");
        }

        return File(Encoding.UTF8.GetBytes(sb.ToString()), "text/csv", "Boeken.csv");
    }
    else
    {
        //Handle the case when listToExport is not 'NTK'...
        return File(Encoding.UTF8.GetBytes("No data to export"), "text/csv", "Boeken.csv");
    }
}


[EDIT]
As per the OP asked in his comment below, is it possible to create a function and use that for other tables as well - yes, it is -
Create a 'switch' statement to handle different table names and customize the query accordingly.
Initialize the 'Data' variable outside of the switch statement, and populate it based on the selected table.
Continue building your CSV export logic as before -
C#
[HttpPost]
public FileResult ExportToCSV(string? listToExport, string tableName)
{
    //Initialize with header...
    string[] book = new string[] { "Titel", "Auteur", "Hugo", "Nebula", "Locus" };

    //Initialize Data outside the switch statement...
    var Data = new List<object>();

    switch (tableName)
    {
        case "NTK":
            //Customize the query for the "NTK" table...
            Data = _context.Boek
                .Include(b => b.Auteur)
                .Include(b => b.Categorie)
                .Where(b => b.CategorieID == 1 && b.ISBN == "0000000000" && (b.Hugo > 0 || b.Nebula > 0 || b.Locus > 0))
                .Select(b => new
                {
                    titel = b.Titel,
                    auteur = b.Auteur!.DisplayName,
                    hugo = b.Hugo.ToString(),
                    nebula = b.Nebula.ToString(),
                    locus = b.Locus.ToString()
                })
                .ToList();
            break;

        //Add cases for other tables as needed...
        case "OtherTable1":
            Data = _context.OtherTable1
                //Customize the query for "OtherTable1"...
                .ToList();
            break;

        case "OtherTable2":
            Data = _context.OtherTable2
                //Customize the query for "OtherTable2"...
                .ToList();
            break;

        //Add more cases for additional tables...

        default:
            //Handle the case when tableName is not recognized...
            return File(Encoding.UTF8.GetBytes("Invalid table name"), "text/csv", "Boeken.csv");
    }

    StringBuilder sb = new StringBuilder();

    foreach (var item in Data)
    {
        //Customize how you extract data from different table types...
        if (tableName == "NTK")
        {
            var dataItem = (dynamic)item;
            book = new string[] { dataItem.titel!, dataItem.auteur!, dataItem.hugo, dataItem.nebula, dataItem.locus };
        }
        else if (tableName == "OtherTable1")
        {
            //Customize for "OtherTable1"...
        }
        else if (tableName == "OtherTable2")
        {
            //Customize for "OtherTable2"...
        }
        //Add more cases as needed...

        for (int j = 0; j < book.Length; j++)
        {
            //Append data with separator...
            sb.Append(book[j] + ',');
        }

        //Append new line character...
        sb.Append("\r\n");
    }

    return File(Encoding.UTF8.GetBytes(sb.ToString()), "text/csv", "Boeken.csv");
}
 
Share this answer
 
v2
Comments
Eddy Sels 2021 3-Sep-23 6:18am    
Thank you for your reply, but what I really want is to generalize the function and replace the if with a switch statement. The "NTK" is used for a table Book, but there are other tables I want to use this function for too. That's why I want the var defined outside the if statement. But as I understand from your answer, this is not possible?
Andre Oosthuizen 3-Sep-23 6:36am    
It is possible, see my updated solution.

For future reference, please give as much information as is possible in your question the first time around, I have spent some time in writing the function in my first solution which is what you asked for but now the parameters have changed and I had to re-write it again.
Eddy Sels 2021 3-Sep-23 10:59am    
Sorry that my hint in the titel was not clear enough. I tried your solution before but it does not work. The declaration of the var outside the if or switch statement gives an error when assigning the var. I tried to paste the error message as a screenshot but that is apparantly not possible so here is the error :
quote
CS0029:Cannot implicitly convert type 'System.Collections.Generic.List<<anonymous type:string="" titel,string="" auteur,string="" hugo,string="" nebula,string="" locus="">>' to 'System.Collections.Generic.List<object>
unqoute
When changing the declaration of Data into an object, then the assignement is ok but then the Data.Count gives an error and also further assignements of Data in the other switch branches.
I first thought it was the naming of the variable because I have a "using Boeken.Data" but Changing the name did not change anything either.
I don't see how I can declare a var that matches the compile time created Anonymous List
Andre Oosthuizen 3-Sep-23 12:45pm    
You can use a common interface or a custom class to store the results of different queries. I have used 'IExportData' interface to define a common structure for the result of different queries, and then specify the type when calling '.ToList()'. You will need to create a class 'ExportData' that implements the 'IExportData' interface and map the properties accordingly for each query -
Defining the common interface -
public interface IExportData
{
    string Titel { get; }
    string Auteur { get; }
    string Hugo { get; }
    string Nebula { get; }
    string Locus { get; }
}

Adjusted code -
[HttpPost]
public FileResult ExportToCSV(string? listToExport, string tableName)
{
    //Initialize with header...
    string[] book = new string[] { "Titel", "Auteur", "Hugo", "Nebula", "Locus" };

    //Initialize Data outside the switch statement
    List<IExportData> Data = new List<IExportData>();

    switch (tableName)
    {
        case "NTK":
            //Customize the query for the "NTK" table...
            Data = _context.Boek
                .Include(b => b.Auteur)
                .Include(b => b.Categorie)
                .Where(b => b.CategorieID == 1 && b.ISBN == "0000000000" && (b.Hugo > 0 || b.Nebula > 0 || b.Locus > 0))
                .Select(b => new ExportData
                {
                    Titel = b.Titel,
                    Auteur = b.Auteur!.DisplayName,
                    Hugo = b.Hugo.ToString(),
                    Nebula = b.Nebula.ToString(),
                    Locus = b.Locus.ToString()
                })
                .ToList<IExportData>();
            break;

        //Add cases for other tables as needed...
        case "OtherTable1":
            Data = _context.OtherTable1
                // Customize the query for "OtherTable1"...
                .Select(ot => new ExportData
                {
                    //Map properties accordingly...
                })
                .ToList<IExportData>();
            break;

        case "OtherTable2":
            Data = _context.OtherTable2
                //Customize the query for "OtherTable2"...
                .Select(ot => new ExportData
                {
                    // Map properties accordingly...
                })
                .ToList<IExportData>();
            break;

        //Add more cases for additional tables...

        default:
            //Handle the case when tableName is not recognized...
            return File(Encoding.UTF8.GetBytes("Invalid table name"), "text/csv", "Boeken.csv");
    }

    StringBuilder sb = new StringBuilder();

    foreach (var item in Data)
    {
        //Customize how you extract data from different table types...
        book = new string[] { item.Titel, item.Auteur, item.Hugo, item.Nebula, item.Locus };

        for (int j = 0; j < book.Length; j++)
        {
            //Append data with separator...
            sb.Append(book[j] + ',');
        }

        // Append new line character...
        sb.Append("\r\n");
    }

    return File(Encoding.UTF8.GetBytes(sb.ToString()), "text/csv", "Boeken.csv");
}
Eddy Sels 2021 3-Sep-23 17:16pm    
Well, this looks promising but I never created/used an Interface before so what I did is create IExportData.cs under models with this content:
namespace Boeken.Models
{
public class IExportData
{
string titel { get; }
string auteur { get; }
string hugo { get; }
string nebula { get; }
string locus { get; }
string categorie { get; }
string taal { get; }
string soort { get; }
}
public class ExportData:IExportData
{
string? titel { get; }
string? auteur { get; }
string? hugo { get; }
string? nebula { get; }
string? locus { get; }
string? categorie { get; }
string? taal { get; }
string? soort { get; }
}

}
I changed the NTK branch as speciefied but now I get following unexpected error:
quote
CS0112:ExportData.titel is inaccessible due to its protection level
unquote
Did I put the IExportData.cs in the wrong place? I don't understand where this comes from.
Creating a class did it. thanks to Andre Oosthuizen. So I created an interface and a class ExportData. There are still some things I don't understand and why it has to be done the way it is.The error messages from VS and the docs from MS were not helpfull. I could not have solved this without help.This is the final class:

C#
namespace Boeken.Models
{
    public class ExportData
    {
        public string? titel { get; set; }
        public string? auteur { get; set; }
        public string? hugo { get; set; }
        public string? nebula { get; set; }
        public string? locus { get; set; }
        public string? categorie { get; set; }
        public string? taal { get; set; }
        public string? soort { get; set; }

    }
}

And this is the final function:

C#
[HttpPost]
        public FileResult ExportToCSV(string? listToExport)
        {
            //Initialize Data outside the switch statement
            List<ExportData> Data = new List<ExportData>();
            //Initialize with header...
            string[] book = new string[] { };
            string[] bookHeader = new string[] { };
            switch (listToExport)
            {
                case "NTK":
                    //Customize the query for the "NTK" table...
                    Data = _context.Boek
                        .Include(b => b.Auteur)
                        .Include(b => b.Categorie)
                        .Where(b => b.CategorieID == 1 && b.ISBN == "0000000000" && (b.Hugo > 0 || b.Nebula > 0 || b.Locus > 0))
                        .Select(b => new ExportData
                        {
                            titel = b.Titel,
                            auteur = b.Auteur!.DisplayName,
                            hugo = b.Hugo.ToString(),
                            nebula = b.Nebula.ToString(),
                            locus = b.Locus.ToString(),
                            categorie = "",
                            taal = "",
                            soort = ""
                        })
                        .ToList<ExportData>();
                    bookHeader = new string[] { "Titel", "Auteur", "Hugo", "Nebula", "Locus" };

                    break;
                case "NTG":
                    //Customize the query for the "NTG" table...
                    Data = _context.Boek
                        .Include(b => b.Auteur)
                        .Include(b => b.Categorie)
                        .Where(b => b.CategorieID == 1 && b.Gelezen == false)
                        .Select(b => new ExportData
                        {
                            titel = b.Titel,
                            auteur = b.Auteur!.DisplayName,
                            hugo = b.Hugo.ToString(),
                            nebula = b.Nebula.ToString(),
                            locus = b.Locus.ToString(),
                            categorie = "",
                            taal = "",
                            soort = ""
                        })
                        .ToList<ExportData>();
                    bookHeader = new string[] { "Titel", "Auteur", "Hugo", "Nebula", "Locus" };

                    break;
                case "WIN":
                    //Customize the query for the "WIN" table...
                    Data = _context.Boek
                        .Include(b => b.Auteur)
                        .Include(b => b.Categorie)
                        .Where(b => b.CategorieID == 1 && (b.Hugo > 0 || b.Nebula > 0 || b.Locus > 0))
                        .Select(b => new ExportData
                        {
                            titel = b.Titel,
                            auteur = b.Auteur!.DisplayName,
                            hugo = b.Hugo.ToString(),
                            nebula = b.Nebula.ToString(),
                            locus = b.Locus.ToString(),
                            categorie = "",
                            taal = "",
                            soort = ""
                        })
                        .ToList<ExportData>();
                    bookHeader = new string[] { "Titel", "Auteur", "Hugo", "Nebula", "Locus" };

                    break;
                case "AUT":
                    Data = _context.Auteur
                         //Customize the query for "Auteur"...
                         .Select(b => new ExportData
                         {
                             titel = "",
                             auteur = b.DisplayName,
                             hugo = "",
                             nebula = "",
                             locus = "",
                             categorie ="",
                             taal = "",
                             soort =""
                         })
                        .ToList<ExportData>();
                    bookHeader = new string[] { ",Auteur" };

                    break;

                case "CAT":
                    Data = _context.Categorie
                         //Customize the query for "Categorie"...
                         .Select(b => new ExportData
                         {
                             titel = "",
                             auteur = "",
                             hugo = "",
                             nebula = "",
                             locus = "",
                             categorie = b.CategorieNaam,
                             taal = ",",
                             soort = ","
                         })
                        .ToList<ExportData>();
                    bookHeader = new string[] { "Categorie," };

                    break;
                case "SRT":
                    Data = _context.Soort
                         //Customize the query for "Soort"...
                         .Select(b => new ExportData
                         {
                             titel = "",
                             auteur = "",
                             hugo = "",
                             nebula = "",
                             locus = "",
                             categorie = "",
                             taal = "",
                             soort = b.SoortNaam
                         })
                        .ToList<ExportData>();
                    bookHeader = new string[] { "Soort," };

                    break;
                case "TAA":
                    Data = _context.Taal
                         //Customize the query for "Taal"...
                         .Select(b => new ExportData
                         {
                             titel = "",
                             auteur = "",
                             hugo = "",
                             nebula = "",
                             locus = "",
                             categorie = "",
                             taal = b.TaalVoluit,
                             soort = ""
                         })
                        .ToList<ExportData>();
                    bookHeader = new string[] { "Taal," };

                    break;

                default:
                    //Handle the case when tableName is not recognized...
                    return File(Encoding.UTF8.GetBytes("Invalid table name"), "text/csv", "Boeken.csv");
            }

            StringBuilder sb = new StringBuilder();
            //Append header with seperator...
            for (int j = 0; j < bookHeader.Length; j++)
            {
                sb.Append(bookHeader[j] + ',');
            }
            //Append new line character...
            sb.Append("\r\n");

            foreach (var item in Data)
            {
                //Customize how you extract data from different table types...
                if (listToExport == "NTK" || listToExport == "WIN" || listToExport == "NTG")
                {
                    var dataItem = (dynamic)item;
                    book = new string[] { dataItem.titel!, dataItem.auteur!, dataItem.hugo, dataItem.nebula, dataItem.locus };
                }
                else if (listToExport == "AUT")
                {
                    //Customize for "Auteur"...
                    var dataItem = (dynamic)item;
                    book = new string[] { dataItem.titel!, dataItem.auteur!, dataItem.hugo, dataItem.nebula, dataItem.locus };

                }
                else if (listToExport == "CAT")
                {
                    //Customize for "Categorie"...
                    var dataItem = (dynamic)item;
                    book = new string[] { dataItem.categorie };

                }
                else if (listToExport == "SRT")
                {
                    //Customize for "Soort"...
                    var dataItem = (dynamic)item;
                    book = new string[] { dataItem.soort };

                }
                else if (listToExport == "TAA")
                {
                    //Customize for "Taal"...
                    var dataItem = (dynamic)item;
                    book = new string[] { dataItem.taal };

                }
                for (int j = 0; j < book.Length; j++)
                    {
                    //Append data with separator...
                    sb.Append(book[j] + ',');
                    }
                 //Append new line character...
                sb.Append("\r\n");
               }


            return File(Encoding.UTF8.GetBytes(sb.ToString()), "text/csv", "Boeken.csv");
        }
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900