有没有更好或更有效的方法来过滤linq

本文关键字:方法 过滤 linq 有效 更好 有没有 | 更新日期: 2023-09-27 18:17:25

我有一个包含属性集合的集合。每个属性都有一个类型和一个Id。我需要在一组属性类型中过滤属性id为或id的集合,但属性类型为和id。我想出了下面的方法,想知道是否有更好的方法。

foreach (var ag in andAttrGrpIds)
{
  filteredModels = filteredModels.Where(x => x.ProductAttributes.Any(pa => pa.AttributeType==ag && orAttributes.Contains(pa.AttributeId))).ToList();            
}

在上面的代码片段中,andattrgrpid和orAttributes都是字符串数组。

有没有更好或更有效的方法来过滤linq

我会这样做:

var filteredModels = from model in originalModels
                     let mAttribs = from pa in model.ProductAttributes
                                    where orAttributes.Contains(pa.AttributeId)
                                    select pa.AttributeType
                     where !andAttrGrpIds.Except(mAttribs).Any()
                     select model;

现在可读性更强了,而且(可能)有更好的性能配置文件。

这个想法是从每个模型中获得所有"合格"产品属性类型的集合,然后测试是否所有 andAttrGrpIds都存在于该集合中。

顺便说一下,您的命名约定看起来很奇怪:andAttrGrpIds集合似乎实际上代表了属性-类型的集合。