【发布时间】:2015-05-01 20:39:08
【问题描述】:
这是我的场景。我有一个文档类。文档通过多对多关系与 DocumentClasses 表相关联,因此文档可以有一个或多个类。运行搜索时,用户可以选择按类别过滤文档。因此,如果用户选择选择任何类,我需要能够将 where 子句附加到我的查询中。逻辑是,如果文档被分配给用户选择的类中的任何类,则应该返回该文档。所以伪代码中需要的基本查询。所以基本上,如果列表 A 中的任何数字属于列表 B,则返回记录。
我已经尝试过了(RestrictByClasses 只是一个 List(Of Integer)):
query = query.where(Function(resultItem) RestrictByClasses.Contains(resultItem.DocumentClassIds.Any())
但我得到以下异常:
The nested query is not supported. Operation1='Case' Operation2='Collect'
有没有办法让 linq 像这样过滤记录?
谢谢!
更新:
在进行了更多调试之后,我认为这更多地与我如何投影到对象上有关,以便使用可用于过滤的值加载它。这是我进行投影的方式:
Dim query = From document In dbContext.Documents
Select New FeeAndReceptionReportIntermediateItem With
{
.BookTypeId = If(restrictByBookTypes AndAlso document.DocumentInstruments.Any(), document.DocumentInstruments.FirstOrDefault().Instrument.BookTypeId, Nothing),
.CustomerId = document.CustomerId,
.DocumentClassIds = If(restrictByDocumentClasses, document.DocumentClasses.Select(Function(group) group.ClassId), Nothing),
.DocumentId = document.DocumentId,
.DocumentNumber = document.DocumentNumber,
.DepartmentId = document.DepartmentId,
.InstrumentGroupIds = If(restrictByInstrumentGroup, document.DocumentInstruments.FirstOrDefault().Instrument.InstrumentGroups.Select(Function(group) group.InstrumentGroupId), Nothing),
.RecordDateTime = document.RecordDateTime,
.RestrictedInstrument = (includeRestrictedDocuments AndAlso document.DocumentInstruments.Any() AndAlso document.DocumentInstruments.FirstOrDefault().Instrument.Restricted)
}
我认为它在抱怨 .DocumentClassIds 和 .InstrumentGroupId 是如何加载到 POCO 对象 (FeeAndReceptionReportIntermediateItem) 中的。我真的很想在初始查询中加载这些,在调用 .ToList() 之前,如果用户没有通过要求我创建连接的限制,我真的不想进行连接,这就是为什么我在加载这些集合时使用导航属性和 if 语句的原因,因为我假设如果“restrictByDocumentClasses”为 false,则不会访问导航属性并且不会包含连接。
【问题讨论】:
标签: linq linq-to-entities