将 where 子句应用于 LightSwitch 查询中的子集合

Applying where clause to childcollection in LightSwitch query

如何在针对子集合的 LightSwitch 查询中使用 where 子句?

在我的示例中,每个博客都可以有很多评论,我想编写这样的查询,以便管理员只看到没有任何评论的博客条目:

query = query.Where(q => q.comment.Count() == 0).SingleOrDefault()

我添加了 SingleOrDefault() 是因为我希望管理员在每个查询中只看到一个项目,然后他们可以添加评论并移至博客屏幕上的下一个项目。

尝试上述查询时,出现以下编译时错误:

错误 2

无法将方法组 'SingleOrDefault' 转换为非委托类型 'System.Linq.IQueryable'。您是否打算调用该方法?

我认为这是正确的错误,因为:

partial void Query1_PreprocessQuery(ref IQueryable<blog> query)
{
    query=query.Where(q => q.Evaluations.Count() == 0).SingleOrDefault;
}

Return IQueryable 是一个集合,不是单个集合。

我尝试将签名更改为部分无效 Query1_PreprocessQuery(参考博客查询),现在我收到另一个编译错误,提示博客不包含 where 的定义。

那么,如何在我的 LightSwitch HTMLClient 应用程序中实现所需类型的查询。

为了组织此类标量查询,您需要在查询的预处理方法中使用以下类型的 LINQ 表达式:

partial void BlogWithNoComment_PreprocessQuery(ref IQueryable<blog> query)
{
    query = query.Where(q => q.comment.Count() == 0).Take(1);
}

此外,您需要通过在查询的 'Number of Results Returned' 属性 中选择 'One' 选项来确保您的查询仅针对 return 单个结果如下(所需的 属性 选择以红色突出显示):

标量查询部分的以下 Microsoft 博客介绍了这种方法:

Visual Studio LightSwitch Team Blog: How to Create Composed and Scalar Queries (Ravi Eda)

尽管本博客中的屏幕示例基于 Silverlight 客户端,但其中涵盖的查询技术同样适用于 HTML 客户端。