Запрос Linq без имен столбцов

#c# #linq #asp.net-core

#c# #linq #asp.net-core

Вопрос:

Я пытаюсь написать запрос LINQ, используя предложение Select ИЛИ Where в полученном списке. Однако в списке нет имени столбца, там есть только значения. Итак, мой вопрос в том, как я могу получить значения на основе этого условия?

Например, список содержит утвержденный статус OnHold. Однако я хочу получать записи со статусом «Одобрено» только из списка. Ниже приведен мой код

 SpreadsheetsResource.ValuesResource.GetRequest request = service.Spreadsheets.Values.Get(spreadsheetId, range);

ValueRange response = request.Execute();
IList<IList<object>> values = response.Values;
  

И ниже приведен скриншот того, как значения выглядят в списке

введите описание изображения здесь

Список с именем «значения» содержит все записи.

Любая помощь по этому вопросу была бы оценена!

Ответ №1:

Ваши данные возвращаются в виде коллекции, поэтому вы можете либо получить доступ к свойствам через их числовой индекс, например

var approvedResults = values.Where(c => c[7] == "Approved");

Или вы можете сопоставить его с соответствующим объектом, что-то вроде

 public class MyResultObject {
   public DateTime date {get; set;}
   public string FirstName {get; set;}
   ...
   public string ApprovedStatus {get; set;}

   public MyResultObject(string[] values)
   {
       date = DateTime.Parse(values[0]);
       FirstName = (string) values[1];
       ...
       etc.
   }
}
  

Затем используйте linq для преобразования ваших данных в набор из них, что будет намного приятнее.

 var myResultObjects = values.Select(c => new MyResultObject(c.Select(x => (string)x).ToArray());
  

Возможно, вам придется немного подправить код, потому что я не знаю точно, как ValueRange работает, и я просто печатаю это, не проверяя, но в этом суть.

Тогда вы можете сделать myResultObjects.Where(c => c.ApprovedStatus == "Approved"); , что намного приятнее.

Комментарии:

1. С помощью var approvedResults = values. Где(c => c [7] == «Одобрено»); выдает ошибку как исключение Index out of range

2. Я предполагаю, что в некоторых ваших записях возвращаются не все 8 столбцов данных. Вы должны проверить качество данных. На самом деле, как вы можете видеть на своем скриншоте, там написано Count = 9 для одних и Count = 8 для других. Если у вас есть запись, в которой количество меньше 8, то это вызовет эту ошибку, потому что в [7] нет столбца для чтения.

3. Да .. Только что обнаружил это во время отладки.. Но у меня нет никакого контроля над поступающими данными.. Итак, как мы можем это проверить?

4. Если в данных нет столбца для Approved , то как вы будете проверять, одобрено это или нет?

5. Вы могли бы фильтровать, просто сделайте values.Where(c => c.Length > 7 amp;amp; c[7] == "Approved"); . Вероятно, лучше заранее выполнить еще один шаг, который очищает данные, возможно, удаляя недопустимые записи.

Ответ №2:

Я добился этого, используя приведенную ниже строку кода

 var result = values.Where(x => x.Contains("Approved")).ToList();
  

Это даст мне только записи со статусом «Одобрено».

Спасибо!

Комментарии:

1. В таком случае, не x ли это ваш массив? Таким образом, выполняется поиск по каждому значению… Если бы у вас был пользователь с фамилией Approved , то она соответствовала бы, даже если статус не был утвержден. Таким образом, он не выдаст вам записи со статусом «Одобрено», он выдаст вам все, в любом столбце которого есть слово «Одобрено»… Плюс не очень эффективно проверять каждый столбец.

2. @NibblyPig Да, согласен с этим! Изменится в соответствии с вашим ответом