我试图根据查询中是否包含字符串“baby”来过滤查询结果。
IEnumerable<ICD.ViewModels.HomeSearchViewModel> query =
ICDUnitOfWork.AlphaGroups.Find().GroupJoin(ICDUnitOfWork.Alphas.Find(),
a => a.AlphaGroupID,
g => g.AlphaGroupID,
(alphaGroups, alphas) =>
new ICD.ViewModels.
HomeSearchViewModel
{
AlphaGroups =
alphaGroups,
Alphas = alphas
})
.Where(row =>
row.AlphaGroups.Title.Contains("baby")
|| row.Alphas.Any(alpha => alpha.Title.Contains("baby"))
);
问题是,当Alpha.Title包含字符串“baby”时,它应该只显示包含“baby”的Alpha,而不是AlphaGroup中的每个alpha。如果AlphaGroup.Title包含“baby”,它应该继续显示组中的每个alpha。我怎么能做到这一点?
答案 0 :(得分:1)
您可以尝试以下内容:
IEnumerable<ICD.ViewModels.HomeSearchViewModel> query =
ICDUnitOfWork.AlphaGroups.Find()
.GroupJoin(
ICDUnitOfWork.Alphas.Find()
.GroupBy(a => new
{
BabyIndicator = a.Title.Contains("baby"),
GroupID = a.AlphaGroupID
}),
a => a.AlphaGroupID,
g => g.Key.GroupID,
(alphaGroups, alphas) =>
new ICD.ViewModels.HomeSearchViewModel()
{
AlphaGroups = alphaGroups,
Alphas = alphaGroups.Title.Contains("baby") ?
alphas.Select(g => g.AsEnumerable()).Aggregate((g1,g2) => g1.Concat(g2)) :
alphas.Aggregate(
(g1,g2) => g1.Key.BabyIndicator ?
g1 :
g2).AsEnumerable()
})
逻辑:
问题是当Alpha.Title包含字符串“baby”时 应该只显示包含“婴儿”的Alpha,而不是每个 AlphaGroup中的alpha。
这里我们按照groupID对alphas进行分组,以及他们是否有婴儿,然后我们将其加入到alphGroups中。因此,我们有四种可能性,没有组,一组没有婴儿,一组只有婴儿,每组一个。为了把这一切拉到一起,我们聚合起如果没有组,则不返回任何组,如果有一个组则返回该组,如果有两个组,则只返回带有婴儿的组。
如果AlphaGroup.Title包含“baby”,它应该继续显示 组中的每个alpha。
这里我们检查一个alphaGroup是否有一个标题宝贝,如果它确实返回整个分组,如果不是应用alpha标题逻辑