LINQ, где запрос на JToken

1

Я новичок в запросе LINQ, и я хочу получить 1 элемент (один с id = 0) из JToken но я не могу узнать, как это должно работать.

Я пробовал много иначе, но этот код, который я пробовал в первую очередь:

var statId0 = from stat in objectRankedStats where (int)stat["id"] == 0 select stat;

У меня есть эта ошибка:

Не удалось найти реализацию шаблона запроса для типа источника "Newtonsoft.Json.Linq.JToken". "Где" не найдено. Вам не хватает ссылки или директивы по использованию для "System.Linq"?

Это то, что выглядит как objectRankedStats:

{[  {
    "id": 40,
    "stats": 
    {
        "totalSessionsPlayed": 10,
        "totalSessionsLost": 8,
        "totalSessionsWon": 2,
    }  
},
{    
    "id": 6,
    "stats":
    {      
        "totalSessionsPlayed": 3,
        "totalSessionsLost": 2,
        "totalSessionsWon": 1, 
    }  
}

]}

Я не понимаю, как "котировки" обрабатывают обратные пространства

Я объявил objectRankedStats следующим образом, и я использую его где-то еще в своем коде, и он работает.

var objectRankedStats = JObject.Parse(output)["champions"];

Вот почему я думаю, что это null: Изображение 174551

Я сделал упрощенную версию кода, который я использую на dotnetFiddle.com: https://dotnetfiddle.net/yS5cTk

  • 4
    Как говорится в ошибке, вы положили, using System.Linq; в шапке еще нет?
  • 3
    Это не действительно JSON. Вы хотели включить имя для массива? Или это внешние { и } ошибки?
Показать ещё 5 комментариев
Теги:
linq
where
json.net

1 ответ

1
Лучший ответ

Этот код работает для меня: https://dotnetfiddle.net/P95aNq

using System;
using System.Linq;
using Newtonsoft.Json.Linq;

namespace ConsoleApplication1
{
    static class Program
    {
        static void Main()
        {
            try
            {
                const string output = @"{""champions"": [  {
    ""id"": 40,
    ""stats"": 
    {
        ""totalSessionsPlayed"": 10,
        ""totalSessionsLost"": 8,
        ""totalSessionsWon"": 2,
    }  
},
{    
    ""id"": 6,
    ""stats"":
    {      
        ""totalSessionsPlayed"": 3,
        ""totalSessionsLost"": 2,
        ""totalSessionsWon"": 1, 
    }  
}
]}";

                var objectRankedStats = JObject.Parse(output)["champions"];

                var champ = objectRankedStats.FirstOrDefault(jt => (int)jt["id"] == 6);

                Console.WriteLine(champ);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
    }
}
  • 0
    Это работает отлично! Не могли бы вы кратко объяснить мне разницу между var statId0 = от stat в objectRankedStats где (int) stat ["id"] == 0 select stat; И var champ = objectRankedStats.FirstOrDefault (jt => (int) jt ["id"] == 6); Пожалуйста?
  • 1
    Ваш statId0 является объектом IEnumerable. Вкратце, IEnumerable - это интерфейс для коллекций, последовательностей. Когда вы используете FirstOrDefault, вы извлекаете первый элемент из последовательности (или нулевое значение, последовательность пуста).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню