Linq以XML动态查询构建

时间:2013-04-28 20:53:31

标签: xml vb.net linq

我已经搜索了一段时间,发现了很多很好的答案,但是当我尝试模仿解决方案中的代码时,每个解决方案都会出错。

我将值传递给应该

的函数
  1. 建立LINQ到XML文件
  2. 选择文件
  3. 按传递给函数的值进行过滤
  4. 创建显示列表
  5. 我的代码如下:

    Dim xelement As XElement = xelement.Load(get_local_data_year_path() & "\" & "PAYMENT.xml")
    Dim elements = From objdata In xelement.Elements("PAYMENT") 
                   Select New With {
                       .id = Trim(objdata.Element("id").Value), 
                       .Date = objdata.Element("paymentdate").Value,
                       .account_id = objdata.Element("account_id").Value
                   }
    
    If straccount_id.Length > 0 Then
       elements.Where(Function(P As PAYMENT) P.account_id.Equals(straccount_id))
    End If
    
    Dim result = (elements).ToList
    

    我遇到的问题是where子句,因为它产生错误

    Overload resolution failed because no accessible 'Where' can be called with these arguments:
    Extension method 'Public Function Where(predicate As System.Func(Of <anonymous type>, Integer, Boolean)) As System.Collections.Generic.IEnumerable(Of <anonymous type>)' defined in 'System.Linq.Enumerable': Nested function does not have a signature that is compatible with delegate 'System.Func(Of <anonymous type>, Integer, Boolean)'.
    Extension method 'Public Function Where(predicate As System.Func(Of <anonymous type>, Boolean)) As System.Collections.Generic.IEnumerable(Of <anonymous type>)' defined in 'System.Linq.Enumerable'.
    

    我想我不确定当它是XML文件时如何声明PAYMENT以及为什么该行根本不起作用。

    任何帮助将不胜感激。如果可能的话,VB.NET示例会被优先使用。

1 个答案:

答案 0 :(得分:0)

您的代码有点令人困惑(straccount_id设置在哪里?),但以下行应该列出与straccount_id匹配的匿名类型(您在第一个查询中创建的内容) :

Dim straccount_id As String = "123456"

Dim results = elements.Where(Function(e) e.account_id.Contains(straccount_id)).ToList()

您还可以通过在查询中使用Where子句并将其转换为列表来完成相同的操作:

Dim elements = (From objdata In xelement.Elements("PAYMENT")
               Where objdata.Element("account_id").Value.Contains(straccount_id)
               Select New With {
                    .id = Trim(objdata.Element("id").Value),
                    .Date = objdata.Element("paymentdate").Value,
                    .account_id = objdata.Element("account_id").Value
               }).ToList()

修改

您可以在一个.Where中组合多个条件。例如,如果您希望获得ID为&#34; 1&#34;和#34; 123456&#34;的account_id (琐碎的例子),你会这样做:

results = elements.Where(Function(e) e.account_id.Contains(straccount_id) And e.id = "1").ToList()

我不确定user had entered a value in an IF statement的含义,但您可以接受输入并在上面的行中使用它们。密钥(来自我在VS2012中的测试)似乎是您声明Function(e)一次,并在其后面添加标准,并根据需要加入AndOr