2011-12-11 56 views
3

我有一個包含屬性集合的集合。每個屬性都有一個類型和一個Id。我需要過濾屬性id在一組屬性類型中的集合,但屬性類型是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

它坐落在這裏 filteredModels從模型=在allModels \t \t \t \t \t讓mAttribs =每年從在model.ProductAttributes \t \t \t \t \t \t \t \t \t其中orAttributes.Contains(pa.AttributeId) \t \t \t \t \t \t \t \t \t select pa。屬性類型 \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)。任何() \t \t \t \t \t其中(string.IsNullOrEmpty(andAttrGrpIds [0])&& andAttrGrpIds.Count()== 1)|| !andAttrGrpIds.Except(mAttribs).Any() \t \t \t \t \t select model; – jason

相關問題