0

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

我正在将值传递给一个应该

  1. 建立 LINQ to XML 文件
  2. 选择档案
  3. 按传递给函数的值过滤
  4. 创建显示列表

我的代码如下:

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 示例。

4

1 回答 1

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 为“1”且 account_id 为“123456”的付款(简单示例),您可以这样做:

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根据需要。

于 2013-04-28T21:55:39.350 回答