2011-12-11 2 views
3

속성 모음이 포함 된 컬렉션이 있습니다. 각 속성에는 유형 및 ID가 있습니다. 나는 속성 ids가 속성 유형의 그룹 내에서 있거나 속성 유형이 and'd 인 콜렉션을 필터링해야한다. 나는 다음과 같은 것을 생각해 내고 더 좋은 방법이 있는지 궁금해한다. 위의 코드에서 더 효율적이거나 효율적인 방법으로 linq을 필터링 할 수 있습니까

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

는 andAttrGrpIds 및 orAttributes 문자열의 배열입니다.

답변

2

내가 할 것이다 :

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 컬렉션은 실제로 유형의 모음을 나타냅니다.

+0

고맙습니다. 나는 이것을 가지고 이것을 방정식의 다른 부분과 병합했다. 여기서 속성 유형 하위 값 중 하나는 값이고 값이다. 어떤 단계에서 두 단계로 진행되는 과정을 하나의 문장으로 축소 시켰습니다. – jason

+0

이 model.ProductAttributes에 PA에서 allModels \t \t \t \t \t하자 mAttribs = 여기에 모델 filteredModels의 = 위치해 있습니다 \t \t \t \t \t \t \t \t \t 곳 orAttributes.Contains (pa.AttributeId) \t \t \t \t \t \t \t \t \t 선택 pa. AttributeType에 \t \t \t \t \t 내버려 objAttribIds = model.ProductAttributes.Select (PA => pa.AttributeId) \t \t \t \t \t 곳 (string.IsNullOrEmpty (andAttributes [0]) && andAttributes.Count() == 1) || ! andAttributes.Except (objAttribIds) .ANY() \t \t \t \t \t 곳 (string.IsNullOrEmpty (andAttrGrpIds [0]) && andAttrGrpIds.Count() == 1) || ! andAttrGrpIds.Except (mAttribs) .Any() \t \t \t \t \t 일부 모델을 선택하십시오. – jason

관련 문제