Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于属性名称/值对创建通用xml linq搜索_C#_Xml_Linq - Fatal编程技术网

C# 基于属性名称/值对创建通用xml linq搜索

C# 基于属性名称/值对创建通用xml linq搜索,c#,xml,linq,C#,Xml,Linq,我有一组正在处理的函数,其中之一是解析XML文件,并返回与我拥有的基于属性的条件匹配的元素 这是我必须使用的XML示例: <rs:insert> <z:row Inst='AM5001' Event='EventA' HostName='HostA' EventType='NORMAL' TXID='0000003327'/> <z:row Inst='AM5001' Event='EventB' HostName='HostB' EventType='NORMA

我有一组正在处理的函数,其中之一是解析XML文件,并返回与我拥有的基于属性的条件匹配的元素

这是我必须使用的XML示例:

 <rs:insert>
<z:row Inst='AM5001' Event='EventA' HostName='HostA' EventType='NORMAL' TXID='0000003327'/>
<z:row Inst='AM5001' Event='EventB' HostName='HostB' EventType='NORMAL' TXID='0000011173'/>
<z:row Inst='AM4067' Event='EventA' HostName='HostA' EventType='NORMAL' TXID='0000011175'/>
<z:row Inst='AM5546' Event='EventC' HostName='HostC' EventType='NORMAL' TXID='0000011177'/>
<z:row Inst='AM4567' Event='EventQ' HostName='HostD' EventType='NORMAL' TXID='0000011593'/>

这是我到目前为止得到的一个片段:

internal protected IEnumerable<XElement> GetElement(XDocument oXMLDoc
        , List<KeyValuePair<string, string>> SearchCriteria)
    {
        var vElementQuery = oXMLDoc.Elements()
            .Where(e => SearchCriteria.ForEach(sc => e.Attribute(sc.Key).Value.ToUpper() == sc.Value.ToUpper()))
            .Select(e => e);

        foreach (var xElement in vElementQuery)
        {
            yield return xElement;
        }
    }
内部受保护的IEnumerable GetElement(XDocument oXMLDoc
,列出搜索条件)
{
var vElementQuery=oXMLDoc.Elements()
.Where(e=>SearchCriteria.ForEach(sc=>e.Attribute(sc.Key).Value.ToUpper()==sc.Value.ToUpper())
.选择(e=>e);
foreach(vElementQuery中的变量xElement)
{
收益率指标;
}
}
vElementQuery的where子句中出现错误:

只有赋值、调用、递增、递减、等待和新对象 表达式可以用作语句

简单地说,我将基于Inst和Event进行查询,但偶尔也需要基于主机名和Eventtype进行查询

基本上,我不知道需要匹配多少属性条件,所以我想将它们作为列表或数组添加进来,认为
KeyValuePair
会很有用,因为它会提供我需要的名称和比较(值)


感谢您的帮助。

其中
需要一个谓词:一个接受
e
XElement
)并返回
bool
的函数

相反,您试图返回
SearchCriteria.ForEach()
的结果,该结果返回
void
。它所做的只是迭代集合,并为每个项调用
void
lambda。所以不能将它用作谓词的主体。这将是修复此问题后的下一个问题,但相同的修复会同时解决这两个问题

.Where(e => 
    SearchCriteria.ForEach(sc => 
        e.Attribute(sc.Key).Value.ToUpper() == sc.Value.ToUpper()
    )
)
因为
ForEach
返回
void
,所以它需要返回
void
的lambda。函数体必须是语句。在lambda中,如果返回类型不是
void
,并且主体是表达式,则返回该表达式的结果——称之为隐式返回语句。但这里的返回值是无效的——这是由以下公式确定的:

如果编译器不在前面提供隐式的
返回
,那就不是一条语句。这是一个表达。作为声明,这是不合法的。尝试编译以下内容:

1 != 2;
同样的错误。C或Perl不会在意,但C会在意

我想您可能想要
Any
而不是
ForEach

.Where(e => 
    SearchCriteria.Any(sc => 
        e.Attribute(sc.Key).Value.ToUpper() == sc.Value.ToUpper()
    )
)

也就是说,返回任何搜索条件与其任何属性匹配的
e
Any
接受谓词并返回
bool
,修复这两个错误

太棒了。谢谢你的帮助,这对我以后会有帮助的。
1 != 2;
.Where(e => 
    SearchCriteria.Any(sc => 
        e.Attribute(sc.Key).Value.ToUpper() == sc.Value.ToUpper()
    )
)