我试图在 .Where()
子句中嵌套 .Any()
来查询本地CosmosDb模拟器 .
代码如下所示;其中 permittedStundentIds
是变量( List<long>
), a
是CosmosDb中的 Document
.Where(a => permittedStudentIds.Any(sId => a.Students.Any(s => s.Id == sId)));
当我执行查询时,我收到错误:
不支持“任何”方法 . ActivityId:800000a8-0002-d600-b63f-84710c7967bb,documentdb-dotnet-sdk / 1.22.0主机/ 64位MicrosoftWindowsNT / 10.0.16299.0
我尝试了多种变体来获得一个等效的表达式,但无济于事 . 唯一有效的是使用 .Contains()
并对学生索引进行硬编码;这是不可行的,因为可能不知道学生人数 .
.Where(a => permittedStudentIds.Contains(a.Students[0].Id));
我确实理解在CosmosDb的Sql API上尚不支持某些lambda扩展,但有没有解决方法呢?
2 回答
在尝试了各种lambda表达式的多种组合之后,这对我来说是有用的 .
我在
DocumentModel
课程中添加了一个StudentIds
属性;冗余但仅用于过滤 .此后,我
OR-ed
查询.Contains()
,如下所示:然后使用如下查询:
对于
query.Or()
部分,我使用了以下类:因此,您有一系列allowedStudentIds和一个包含学生序列的文档 . 每个学生都有一个Id .
您想知道是否有任何allowedStudentsId也是您的文档学生中一个(或多个)的ID .
换句话说,如果allowedStudentIds的值为1,2,您想知道Document.Students中是否有Id 1或2的学生 .
为什么不提取所有学生的ID,将它们与您的allowedStudentIds相交并查看结果是否为空?
如果两个序列都是AsQueryable,则此方法有效,但如果您的Document.Students是IQueryable并且您的allowedStudentIds是IEnumerable,它也应该有效 . 我最好的猜测是,这将成为一个SQL包含 . 见Queryable.Intersect