LinQ
在不访问您的代码的情况下,我们很难“调试”您的代码。但是,当我编写复杂LinQ
的查询时,我总是尝试一次构建每个连续的步骤,这样如果我确实遇到错误,我知道它来自我添加的最后一点。此外,请密切注意LinQ
您正在调用的方法所需的输入和返回类型。
作为一个例子,您的错误表明您的部分查询需要一个Boolean
类型而不是一个'System.Collections.Generic.IEnumerable(Of OMR.OMRInterfaceCustomCode.OMRBuildingSurvey)
类型......我可以在您的查询中看到的唯一必需Boolean
值来自该Where
方法:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
因此,我只能假设您的部分查询正在返回OMRBuildingSurvey
对象集合而不是所需的Func<TSource, bool>
谓词。如果我们查看这部分p.OMRBuildingSurveys.Where(Function(s) s.PeriodID > 50)
,我们可以看到这将返回一个满足谓词条件IEnumerable
的实例。OMRBuildingSurvey
然而,这个结果集合被馈送到m.Properties.Where
也需要一个Func<TSource, bool>
谓词的子句......所以看起来我们已经找到了错误。
更新>>>
好的......根据我的更好判断,我会试一试,因为我对你的课程结构视而不见。
从右侧开始,p.OMRBuildingSurveys.Where(Function(s)
s.PeriodID > 50)
我们了解到返回满足谓词条件IEnumerable
的实例。OMRBuildingSurvey
那么这个系列的下一步是什么?
我们需要找到Property
包含任何这些OMRBuildingSurvey
实例的对象:
m.Properties.Where(Function(p) p.OMRBuildingSurveys.Intersect(p.OMRBuildingSurveys.
Where(Function(s) s.PeriodID > 50)).Any())
我什至不确定这是否会起作用......我们在这里尝试做的是返回一个IEnumerable
类型,其中包含具有满足其(CLR)属性中的谓词条件的Property
任何实例的项目。该方法将每个属性的值与满足谓词条件的实例的输出连接起来,并返回任何相同的值。OMRBuildingSurvey
PeriodID
OMRBuildingSurveys
Intersect
OMRBuildingSurveys
IEnumerable
OMRBuildingSurvey
Any
最后一步是这样的:
var query = OMRMarketsQuery.Include("Properties.OMRBuildingSurveys").Where(Function(m)
m.Properties.Intersect(m.Properties.Where(Function(p) p.OMRBuildingSurveys.
Intersect(p.OMRBuildingSurveys.Where(Function(s) s.PeriodID > 50)).Any())).Any())
我基本上做了同样的事情......使用前面的“查询到目前为止”作为属性Intersect
上调用的方法的输入参数OMRBuildingSurvey.Properties
。现在,我希望这行得通,因为我没有更多的时间来做这件事了。此外,由于我编写 C#,VB可能已“关闭”,但我相信如果此示例不起作用,您可以使用我提供的信息完成此操作......当您破坏它们时,这些查询并不是那么糟糕像我一样倒下。
顺便说一句,此示例遵循您问题中的要求,而不是您上一条评论中的要求。