0

I'm using linq to make a query in a documentdb collection which consists of items with two individual arrays like:

{
 name: "Family 1",
 cars: ["Toyota", "Honda"],
 pets: ["Cat", "Dog"]
}

Lets say that I want to find families with a Toyota, I would use a query like this:

var families = Client.CreateDocumentQuery<T>(dLink)
    .SelectMany(f => f.Cars
                .Where(car=> car == "Toyota")
                .Select(car => f));

This works just fine. When inspecting the generated sql query it also looks as expected:

SELECT VALUE root FROM root JOIN car IN root[\"Cars\"] WHERE (car= \"OU=Brugere\")

If I want to find all families with a Toyota and a dog, I would expect to be able to use a query that looks something like this:

var families = Client.CreateDocumentQuery<T>(dLink)
    .SelectMany(f => f.Cars
                .Where(car=> car == "Toyota")
                .Select(car => f))
    .SelectMany(f => f.Pets
                .Where(pet => pet == "Dog")
                .Select(pet => f));

This fails with a cryptic error message:

 {"errors":[{"severity":"Error","location":{"start":109,"end":111},"code":"SC2001","message":"Identifier 'pet' could not be resolved."}]}

When inspecting the generated sql query, it does not look as expected:

SELECT VALUE root FROM root JOIN car IN root[\"Cars\"] WHERE ((car= \"Toyota\") AND (pet = \"Dog\")) "}

This makes it obvious why 'pet' cannot be resolved, it's missing a Join for pet in root[\"Pets"]

How do I make two distinct joins via linq in documentdb?

1 Answer 1

0

Given the SQL output from toString(), it looks like there is a bug in the LINQ provider. We'll work on a fix.

In the meantime, I'd advise issuing the query as a SQL query:

SELECT *
FROM c
WHERE ARRAY_CONTAINS(c.cars, "Toyota")
      AND ARRAY_CONTAINS(c.pets, "Cat")
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.