Запись и загрузка файла CSV с использованием методов linq в c# возвращает неверные данные - PullRequest
0 голосов
/ 15 апреля 2020

В ASP. NET Ядро, я использую метод Linq для получения моих данных из моей таблицы Prescriptions из базы данных, я пытаюсь записать эти данные в CSV-файл с именем FutureFills.csv in wwwroot и загрузите этот файл. Вот контроллер

[HttpGet]
[Route("~/FutureFills")]
[Produces("text/csv")]
public IActionResult ExportFile()
{

    var futurefills = _context.Prescriptions
      .Where(f => f.FolderStatusId == 9)
      .Where(d => d.DeliveryDate == DateTime.Today.AddDays(1))
      .ToList();

    System.IO.MemoryStream stream = new System.IO.MemoryStream();
    System.IO.StreamWriter write = new System.IO.StreamWriter(Stream);

    CsvFileDescription file = new CsvFileDescription 
    { 
        SeparatorChar = ',', FirstLineHasColumnNames = true 
    };

    return File(System.Text.Encoding.ASCII.GetBytes(futurefills.ToString()), "text/csv", "FutureFills.csv");
}

Итак, у меня есть кнопка на странице, которая вызывает это действие и загружает CSV-файл, он загружает и, кажется, работает, но когда я открываю CSV-файл, это не данные, которые Мне нужно, я ожидаю получить таблицу Prescriptions из моей базы данных, однако я получаю это в CSV-файле

enter image description here

Что я делаю неправильно, что он не записывает правильные данные в файл?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Кажется, что вы просто выводите futurefills.ToString(), который просто выводит имя типа объекта, который он содержит.

Вы уверены, что futurefills.ToString() содержит ожидаемое вами значение? Попробуйте отладить ваше приложение и проверьте значение futurefills после Linq-запроса.

Вам нужно перебрать каждый элемент объекта futureFills, который, как вы видели, содержит элементы. Поэтому вам нужно написать конструкцию, подобную этой:

var output = new StringBuilder();
foreach (var row in futurefills)
{
    output.AppendLine(row.Field1 + ", " + row.Field2);
}

И тогда вы можете go впереди и output.ToString()

Что-то вроде этого:

return File(System.Text.Encoding.ASCII.GetBytes(output.ToString()), "text/csv", "FutureFills.csv");
1 голос
/ 15 апреля 2020

Вы никогда не выполняли запрос. Добавьте .ToList() в конец futureFills

    var futurefills = _context.Prescriptions
      .Where(f => f.FolderStatusId == 9)
      .Where(d => d.DeliveryDate == DateTime.Today.AddDays(1)).ToList();
...