如何使用c#xelement动态过滤?

时间:2013-07-29 07:03:19

标签: c# xml linq linq-to-xml

我已经完成了我的搜索,无法找到问题的解决方案。

我对c#.net有点新鲜。

这是我的问题。我正在尝试动态过滤xelement。

属性的数量和属性的值是未知的,并且将取决于其他一些例程/过程。

这些我要过滤的属性名称,可以是一个或多个要过滤的属性。

string[] param = new string[] { "techcode", "productgroup", "photolayer" }

我的xml文件采用以下格式:

<?xml version="1.0" encoding="utf-8"?>
<threads>
  <thread techcode="sometech" productgroup="pgroup" 
          photolayer="player" biasewma="-0.05" />
</threads>

如果我硬编码这样的话,我可以成功过滤

IEnumerable<XElement> singlethread = (from el in apcxmlstate.Elements("thread")
  where 
    (string)el.Attribute("techcode") == somevalue
    && (string)el.Attribute("productgroup") == somevalue
    && (string)el.Attribute("photolayer") == somevalue
  select el);

然而,这不是我想要的,因为我不知道我想要过滤哪个属性。它将动态生成。

例如,在运行时,我想要过滤的属性只是techcode和productgroup。任何善良的灵魂都会帮我提供建议。

1 个答案:

答案 0 :(得分:6)

您可以动态构建查询:

IEnumerable<XElement> query = apcxmlstate.Elements("thread");

foreach(var name in param)
   query = query.Where(t => (string)t.Attribute(name) == someValue);

更新:我认为您的问题是,您尝试为每个属性获取不同的值,而不是单个someValue变量。但只有最后一个是在lambda中捕获的。您需要创建局部变量来存储每个lambda的值:

IEnumerable<XElement> singlethread = apcxmlstate.Elements("thread"); 

foreach (var name in param) {
   var value = row[name].ToString();
   singlethread = singlethread.Where(t => (string)t.Attribute(name) == value); 
}