Ami*_*ail 5 c# xml linq linq-to-xml
我已经完成了我的搜索,但无法找到解决问题的方法.
我对c#.net有点新鲜.
这是我的问题.我正在尝试动态过滤xelement.
属性的数量和属性的值是未知的,并且将取决于一些其他例程/过程.
这些我要过滤的属性名称,可以是一个或多个要过滤的属性.
string[] param = new string[] { "techcode", "productgroup", "photolayer" }
Run Code Online (Sandbox Code Playgroud)
我的xml文件采用以下格式:
<?xml version="1.0" encoding="utf-8"?>
<threads>
<thread techcode="sometech" productgroup="pgroup"
photolayer="player" biasewma="-0.05" />
</threads>
Run Code Online (Sandbox Code Playgroud)
如果我硬编码这样的东西,我可以成功过滤
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);
Run Code Online (Sandbox Code Playgroud)
但是,这不是我想要的,因为我不知道我想要过滤哪个属性.它将动态生成.
例如,在运行时,我想要过滤的属性仅为techcode和productgroup.任何善良的灵魂都会帮我提供建议.
您可以动态构建查询:
IEnumerable<XElement> query = apcxmlstate.Elements("thread");
foreach(var name in param)
query = query.Where(t => (string)t.Attribute(name) == someValue);
Run Code Online (Sandbox Code Playgroud)
更新:我认为您的问题是,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);
}
Run Code Online (Sandbox Code Playgroud)