根据条件过滤查询

时间:2012-11-13 23:11:28

标签: c# asp.net-mvc asp.net-mvc-3 linq linq-to-entities

我试图根据查询中是否包含字符串“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。我怎么能做到这一点?

1 个答案:

答案 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标题逻辑