Using Concurrent Dictionary and Lazy to cache expensive query results and only run query once in a threadsafe manner
What you have will work, but there are a few incremental improvements.  Rather than using TryAdd you can use GetOrAdd which returns the value for that key.  This will save you a lookup (and also remove a race condition where the key is removed between calls by another thread).

Also note that, currently, you're caching any errors that you get, and continuing to serve them out.  If you're okay with that, or aren't worried about it, then okay.

You should do some tests to be sure, but it may be faster to use the overload of GetOrAdd that accepts a function, rather than a value.  This will allow you to construct the Lazy only when a new one is needed, rather than on every call.  Constructing a Lazy isn't that expensive (it doesn't need to actually compute the value after all) but this is likely still a win in most situations.