user1618825
user1618825

Reputation:

How to use LINQ with dynamic collections

Is there a way to convert dynamic object to IEnumerable Type to filter collection with property.

dynamic data = JsonConvert.DeserializeObject(response.Content);

I need to access something like this

var a = data.Where(p => p.verified == true)

Any Ideas?

Upvotes: 80

Views: 53380

Answers (4)

Varun
Varun

Reputation: 484

This might help, replace jsonString with response.Content and use nested loops if required based on your response content.

In the below code JValue.Parse will return JToken which is IEnumerable

        string jsonString = "[{\"Question\":{\"QuestionId\":49,\"QuestionText\":\"Whats your name?\",\"Answer\":\"xyz\"}},{\"Question\":{\"QuestionId\":51,\"QuestionText\":\"Are you smart?\",\"Answer\":\"Yes\"}}]";
        dynamic myObject = JValue.Parse(jsonString);
        foreach (dynamic questions in myObject)
        {
            Console.WriteLine(questions.Question.QuestionId + "." + questions.Question.QuestionText.ToString());
            Console.WriteLine("Ans. " +questions.Question.Answer);
            Console.WriteLine();
        }
        Console.Read();

Upvotes: 0

user3407039
user3407039

Reputation: 1335

If you are able to, the ideal solution is to specify the type when deserializing, so to avoid having to cast later. This is a lot cleaner than the approaches suggested above.

So if you have -

dynamic data = JsonConvert.DeserializeObject(response.Content);

Then simply change this to -

var data = JsonConvert.DeserializeObject<IEnumerable<dynamic>>(response.Content);

Upvotes: 0

Yaser Moradi
Yaser Moradi

Reputation: 3307

Try casting to IEnumerable<dynamic>

((IEnumerable<dynamic>)data).Where(d => d.Id == 1);

This approach is 4x faster than other approachs.

good luck

Upvotes: 58

Jon Skeet
Jon Skeet

Reputation: 1500035

So long as data is an IEnumerable of some kind, you can use:

var a = ((IEnumerable) data).Cast<dynamic>()
                            .Where(p => p.verified);

The Cast<dynamic>() is to end up with an IEnumerable<dynamic> so that the type of the parameter to the lambda expression is also dynamic.

Upvotes: 130

Related Questions