文档数据库 linq 查询,SelectMany 之后的 SelectMany

Document db linq query, SelectMany after SelectMany

我正在使用 linq 在 documentdb 集合中进行查询,该集合由具有两个单独数组的项目组成,例如:

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

假设我想查找拥有丰田汽车的家庭,我会使用这样的查询:

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

这很好用。检查生成的 sql 查询时,它看起来也符合预期:

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

如果我想找到所有拥有丰田和狗的家庭,我希望能够使用如下所示的查询:

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));

此操作失败并显示一条神秘的错误消息:

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

检查生成的 sql 查询时,它看起来不像预期的那样:

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

这很明显为什么 'pet' 无法解析,它在 root 中缺少一个 Join for pet [\"Pets"]

如何在 documentdb 中通过 linq 进行两个不同的连接?

鉴于 toString() 的 SQL 输出,看起来 LINQ 提供程序中存在错误。我们将努力解决问题。

同时,我建议将查询作为 SQL 查询发出:

SELECT *
FROM c
WHERE ARRAY_CONTAINS(c.cars, "Toyota")
      AND ARRAY_CONTAINS(c.pets, "Cat")