title: Using LINQtoCSV in MvcScaffolding ASP.NET Web Page
body: <p>I'm trying to add a link to a basic MvcScaffolding project that outputs all data from a IQueryable interface.  The controllers are built with <code>Scaffold Controller Sales -Repository</code> and have nothing out of the ordinary in the Sale class, just a few strings and some integers.  Everything in the project works as expected.</p>
  
  <p>From posts I've found, LINQtoCSV could be a possible solution for me (http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library).  Unfortunately, I don't know what to add. If I have a link on the index page of /Sales/ that points to /Sales/CSV/, how can prompt the user with "Download or Open"?</p>
  
  <p>I also saw this page (http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters) that tells how to build a Web API, but I cannot use MVC 4 per company standards.</p>
  
  <p>The code I currently have in <code>SalesController.cs</code> is the following (which errors with <code>[DirectoryNotFoundException: Could not find a part of the path 'C:\...\Sales\CSV\LINQtoCSV.CsvContext'.]</code>):</p>
  
  <pre><code>    //
      // GET: /Sales/CSV/
      [Authorize]
      public FilePathResult CSV()
      {
          List&lt;Sale&gt; dataRows = saleRepository.All.ToList();
  
          CsvFileDescription outputFileDescription = new CsvFileDescription
          {
              SeparatorChar = '\t', // tab delimited
              //EnforceCsvColumnAttribute = false,
              FirstLineHasColumnNames = true, // no column names in first record
              FileCultureName = "en-US" // default is the current culture
          };
          CsvContext cc = new CsvContext();
  
          cc.Write&lt;Sale&gt;(dataRows,
              "output.csv",
              outputFileDescription);
  
          return File(cc.ToString(), "text/csv");
      }
  </code></pre>
  
  <p><strong>EDIT:</strong>
  Modified code to create list from repository and output using File().</p>
  
  <p><strong>EDIT:</strong>
  This is the modified code that I'm using.  In the model, I'm building the string with a joined list.  The controller code is as follows:</p>
  
  <pre><code>    [Authorize]
      public FileStreamResult CSV3()
      {
          MemoryStream output = new MemoryStream();
          StreamWriter writer = new StreamWriter(output);
          saleRepository.All.ToList().ForEach(s =&gt; writer.WriteLine(s.ToStringCSV));
  
          writer.Flush();
          output.Position = 0;
  
          return File(output, "text/csv", "report.csv");
      }
  </code></pre>