如何解决在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;
}
结果:
顺便说一句,下面的代码也可以正常工作。
var entityList = container.GetItemLinqQueryable<Department>(true).SelectMany(c => c.Employees).ToList<Employee>();
return entityList;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。