#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 Да, согласен с этим! Изменится в соответствии с вашим ответом