在CosmosDB的GetItemLinqQueryable中使用LINQ查询时出现问题

如何解决在CosmosDB的GetItemLinqQueryable中使用LINQ查询时出现问题

在对CosmosDB容器使用linq查询时,我遇到了挑战,想知道是否有人提供了一些提示。

该容器称为Departments,有多个“部门”条目,每个部门都有一个嵌套的数组“ Employees”,其中包含employee-“ objects”,如果没有雇员,则为空。

{
    "Name": "Microsoft","Employees": [
        {
            "Firstname": "Lars","Lastname": "Larsen","Startdate": "2017-01-01T00:00:00","Enddate": "0001-01-01T00:00:00","Birthdate": "1983-01-10T00:00:00","DepartmentID": "b70ab2b6-58d7-45bb-9b13-49f7d97a8aea","Department": null,"PositionID": "1ba094a4-ce2e-463c-b45e-a81231070ed8","Position": null,"id": "68991651-400c-427b-8839-3f1bcfc72054"
        },{
            "Firstname": "Knut","Lastname": "Knutsen","Startdate": "2019-06-15T00:00:00","Birthdate": "1992-01-10T00:00:00","PositionID": "3ba04314-02ff-4603-b80e-b71e316e9c37","id": "e106fbc7-c791-446e-a163-a5d29512980e"
        }
    ],"id": "b70ab2b6-58d7-45bb-9b13-49f7d97a8aea","_rid": "qwN-AML8frwCAAAAAAAAAA==","_self": "dbs/qwN-AA==/colls/qwN-AML8frw=/docs/qwN-AML8frwCAAAAAAAAAA==/","_etag": "\"00000000-0000-0000-9594-5efd0a9f01d6\"","_attachments": "attachments/","_ts": 1601296753

我的目标是仅返回员工列表,而不管部门是什么。 在带有查询字符串“ SELECT * FROM c.Employees中的ch”的后端C#代码中,它可以正常工作。

这是具有SQL字符串功能的代码:

var query = "SELECT * FROM ch in c.Employees";

        var queryDefinition =
            new QueryDefinition(
                query);

        var setIterator =
            _container.GetItemQueryIterator<Employee>(
                queryDefinition);

        var entityList = new List<Employee>();

        while (setIterator.HasMoreResults)
        {
            entityList.AddRange(await setIterator.ReadNextAsync());
        };

        return entityList;

下面的代码重写适用于LINQ查询,但是我在检索所有员工之后执行此操作,这在以后添加过滤以按部门,职位等获取特定员工时是不必要的。这是工作示例:

using (FeedIterator<Department> setIterator = _container.GetItemLinqQueryable<Department>().ToFeedIterator())
        {
            var entityList = new List<Department>();

            while (setIterator.HasMoreResults)
            {
                entityList.AddRange(await setIterator.ReadNextAsync());
            };

            var employeeList = entityList.SelectMany(c => c.Employees).ToList();

            return employeeList;
        }

但是,如果我将linq查询作为GetItemLinqQueryable的一部分,则会收到错误消息“ IQueryable不包含'ToFeedIterator'的定义,并且还会出现错误,因为它无法从Department转换为Employee。

.SelectMany(c => c.Employees)上有错误,等待setIterator.ReadNextAsync(),但不知道如何可视化。但是这是代码。

using (FeedIterator<Department> setIterator = _container.GetItemLinqQueryable<Department>()
            .SelectMany(c => c.Employees)
            .ToFeedIterator<Department>())
        {
            var entityList = new List<Employee>();

            while (setIterator.HasMoreResults)
            {
                entityList.AddRange(await setIterator.ReadNextAsync());
            };

            return entityList;
        }

有人知道是否有可能执行所有这些操作,并且可以通过附加到cosmosDB的一个查询中的linq进行过滤,所以我不需要淘汰所有员工然后进行过滤?

谢谢! 希望我的帖子不要太混乱,我试图使它很清楚。

解决方法

您可以尝试

 var queryOptions = new QueryRequestOptions
            {
                MaxConcurrency = -1,PartitionKey = PartitionKey.None;// May be null
            };

             _container.GetItemLinqQueryable<Department>(requestOptions: queryOptions)
            .SelectMany(c => c.Employees)
            .ToFeedIterator<Department>())
,

请尝试以下操作:

using (FeedIterator<Employee> setIterator = container.GetItemLinqQueryable<Department>()
                .SelectMany(c => c.Employees)
                .ToFeedIterator<Employee>())
            {
                var entityList = new List<Employee>();

                while (setIterator.HasMoreResults)
                {
                    entityList.AddRange(await setIterator.ReadNextAsync());
                };

                return entityList;
            }

结果:

enter image description here

顺便说一句,下面的代码也可以正常工作。

var entityList = container.GetItemLinqQueryable<Department>(true).SelectMany(c => c.Employees).ToList<Employee>();
return entityList;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res