我有一个具有三个Where子句的LINQ查询。在每个Where子句中,我都在查找同一组项目以比较值:

var items = _umbracoHelper.GetPage(ItemsPage.ModelTypeAlias).Children
                .Where(x => level1Category == 0 || x
                                .GetPropertyValue<IEnumerable<IPublishedContent>>(UmbracoAlias.Item.Categories)
                                .Select(y => y.Id).Contains(level1Category))
                .Where(x => !level2Categories.Any() || x
                                .GetPropertyValue<IEnumerable<IPublishedContent>>(UmbracoAlias.Item.Categories)
                                .Select(y => y.Id).Intersect(level2Categories.AsEnumerable()).Any())
                .Where(x => !level3Categories.Any() || x
                                .GetPropertyValue<IEnumerable<IPublishedContent>>(UmbracoAlias.Item.Categories)
                                .Select(y => y.Id).Intersect(level3Categories.AsEnumerable()).Any());


有没有一种方法可以一次获取UmbracoAlias.Items.Categories的值并将该值存储在其他where子句中,而又不会导致GetPropertyValue方法执行一次以上?

最佳答案

您可以将每个项目与类别ID配对,如下所示:

var items = _umbracoHelper.GetPage(ItemsPage.ModelTypeAlias).Children
    .Select(c => new {
        Child = c
    ,   CategoryIds = c
           .GetPropertyValue<IEnumerable<IPublishedContent>>(UmbracoAlias.Item.Categories)
           .Select(y => y.Id)
           .ToList()
    })
    .Where(x => level1Category == 0     || x.CategoryIds.Contains(level1Category))
    .Where(x => !level2Categories.Any() || x.CategoryIds.Intersect(level2Categories.AsEnumerable()).Any())
    .Where(x => !level3Categories.Any() || x.CategoryIds.Intersect(level3Categories.AsEnumerable()).Any())
    .Select(x => x.Child);


这将对与子类别ID配对的子项进行过滤,然后仅将Child对象保留在最终投影中。

您可以通过组合所有三个Where子句来进一步简化此操作:

var items = _umbracoHelper.GetPage(ItemsPage.ModelTypeAlias).Children
    .Where(c => {
        var categoryIds = c
           .GetPropertyValue<IEnumerable<IPublishedContent>>(UmbracoAlias.Item.Categories)
           .Select(y => y.Id)
           .ToList();
        if (level1Category != 0 && !categoryIds.Contains(level1Category)) {
            return false;
        }
        if (level2Categories.Any() && !categoryIds.Intersect(level2Categories.AsEnumerable()).Any()) {
            return false;
        }
        if (level3Categories.Any() && !categoryIds.Intersect(level3Categories.AsEnumerable()).Any()) {
            return false;
        }
        return true;
    });

关于c# - 在多个linq Where子句中使用相同的查找值,而不必查找多次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49335839/

10-13 02:23