Json.NET obtém valor jToken aninhado

Estou trabalhando na análise de uma resposta http json com o Json.NET e tenho código de trabalho, mas tenho certeza de que estou fazendo isso de uma maneira excessivamente complicada. Minha pergunta é se existe uma maneira mais direta de obter um filho jToken pelo caminho e / ou desserializá-lo sem ultrapassar todos os níveis.

Eu tentei essa abordagem, mas ela retorna nula:

  JObject jObj = JObject.Parse( text );
  JToken myVal;
  jObj.TryGetValue( "response.docs", out myVal );

Aqui está o meu código excessivamente complicado, incluindo desserialização:

  JObject jObj = JObject.Parse( text );

  foreach( var kv in jObj ) {
    if( kv.Key == "response" ) {
      foreach( JToken jt in kv.Value ) {
        if( jt.Path == "response.docs" ) {
          JEnumerable<JToken> children = jt.Children();
          foreach( JToken t in children ) {       
            //THIS WORKS BUT IS NOT ELEGANT 
            Solr_User[] su = t.ToObject<Solr_User[]>();
          }
        }
      }
    }
  }

E aqui está a resposta bruta do JSON apenas para referência:

{
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"*:*",
      "indent":"on",
      "wt":"json"}},
  "response":{"numFound":4,"start":0,"docs":[
      {
        "id":3,
        "first_name":"Bob",
        "_version_":"1558902640594649088"},
      {
        "id":4,
        "first_name":"Sam",
        "_version_":"1558902640613523456"},
      {
        "id":2,
        "first_name":"Fred",
        "_version_":"1558902640613523457"},
      {
        "id":1,
        "first_name":"Max",
        "_version_":"1558902640613523458"}]
  }}

questionAnswers(1)

yourAnswerToTheQuestion