2013-04-05 42 views
1

我对LINQ有一个LINQ查询,它给了我一个嵌套列表的列表,每个子列表都是一个元素列表(“row “)属性。使用LINQ查询XML并排除属性值等于元素的值

var items = loadbodies.Descendants("row").Select(a => a.Attributes().Select(b => b.Value).ToList()).ToList(); 

这按预期工作,但我确实需要为查询该对值的另一份名单,以免有子列表添加其中的一个元素属性(“MESSAGEID”)是第二名单上。我可以做到这一点的价值,但需要检查整个第二列表。

查询从第二个列表中排除单个硬编码值的单个子列表如下。

var items = loadbodies.Descendants("row").Where(c => (string)c.Attribute("messageID") != "avaluefromthesecondlist").Select(a => a.Attributes().Select(b => b.Value).ToList()).ToList(); 

任何帮助将不胜感激。

回答

1

只需使用Contains。需要注意的是分割线大大有助于可读性:

var ids = ...; // Some sequence of ids, e.g. a List<string> or HashSet<string> 
var items = loadbodies 
     .Descendants("row") 
     .Where(row => ids.Contains((string) row.Attribute("messageId"))) 
     .Select(a => a.Attributes() 
        .Select(b => b.Value) 
        .ToList()) 
     .ToList(); 

注意,你可以使用一个Join呼叫太......但只要你有相对较少的ID,这应该是罚款。

+0

对于单行的道歉,我没有想到它会影响其他人的可读性。我得到一个“布尔不包含'选择'的定义”错误? – Syrsyrian 2013-04-05 15:49:00

+0

@Syrsyrian:我错过了一个右括号 - 现在再试一次。 – 2013-04-05 15:54:19

+0

完美。出于好奇,有没有类似于“Contains”的东西,而是相反的,比如“DoesNotContain”? – Syrsyrian 2013-04-05 16:01:13

相关问题