【问题标题】:Cosmos DB Linq query always returns 0 resultsCosmos DB Linq 查询始终返回 0 个结果
【发布时间】:2023-03-14 02:45:01
【问题描述】:

我有一个结构如下的简单文档:

Id:guid id
FamilyName:"some name"
Children:[
{
  name:"somename",
  age:agevalue

}]

基于我的 sql 查询的以下语句返回一行数据:

SqlQuerySpec query = new SqlQuerySpec(@"SELECT f  FROM Families f
                                           JOIN c IN f.Children
                                           WHERE c.name='somename'");               

var test = client.CreateDocumentQuery<FamilyModel>(docColUri, query, option).ToList();

但是当我尝试使用 linq 时,我总是得到零结果。我将以下内容用于 linq:

 var x = client.CreateDocumentQuery<FamilyModel>(docColUri, option)
                                      .SelectMany(f=>
                                          f.Children.Where(c=> c.name == "somename"))
                                           .ToList();

谁能帮助我,让我知道我做错了什么?

【问题讨论】:

    标签: linq-to-sql azure-cosmosdb azure-cosmosdb-sqlapi


    【解决方案1】:

    运行与您相同的查询,我设法返回了一个结果。这是我正在使用的文档:

    "id": "1",
    "FamilyName": "Smith",
    "Children": [
        {
            "name": "John",
            "age": 21
        }
    ],
    "_rid": "Gj0yANGrYVIDAAAAAAAAAA==",
    "_self": "dbs/Gj0yAA==/colls/Gj0yANGrYVI=/docs/Gj0yANGrYVIDAAAAAAAAAA==/",
    "_etag": "\"e6015c65-0000-0800-0000-5e94d6380000\"",
    "_attachments": "attachments/",
    "_ts": 1586812472
    

    我已经为 FamilyModel 设置了一个类,如下所示:

    public class FamilyModel
    {
        public string id { get; set; }
        public string FamilyName { get; set; }
        public Children[] Children { get; set; }
    }
    
    public class Children
    {
        public string name { get; set; }
        public int age { get; set; }
    }
    

    为了运行查询,我有以下代码(简单的 .NET 控制台应用程序)。

    static void Main(string[] args)
        {
            Uri collectionLink = UriFactory.CreateDocumentCollectionUri(databaseName, collectionName);
    
            var option = new FeedOptions()
            {
                EnableCrossPartitionQuery = true
            };
    
            using (client = new DocumentClient(new Uri(endpoint), primaryKey))
            {
    
                var x = client.CreateDocumentQuery<FamilyModel>(collectionLink, option)
                    .SelectMany(f => f.Children.Where(c => c.name == "John"))
                    .ToList();
    
                foreach (var result in x)
                {
                    Console.WriteLine(result.name);
                    Console.WriteLine(result.age);
                }
            }
        }
    

    我在控制台中返回以下结果:

    您是否在选项中启用了跨分区查询?我假设您的分区键是 /id 如果不是,请告诉我,我可以尝试重新创建您的问题。

    如果我在这里遗漏了您设置不同的内容,请告诉我,以便我重新创建您的场景。

    希望这会有所帮助:)

    【讨论】:

    • 谢谢@Will-V,非常感谢您尝试这个。是的,我启用了跨分区查询,但仍然没有得到任何输出。是否可以分享您创建的控制台应用解决方案?
    • 嘿@AzureSPDev 这是 GitHub 上项目的链接:github.com/willvelida/cosmos-linq-demo
    • 酷,您有任何问题,请随时提问:)
    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多