0

しばらく検索したところ、この質問に対する多くの優れた回答が見つかりましたが、ソリューションのコードを模倣しようとすると、各ソリューションでエラーが発生します。

関数に値を渡す必要があります

  1. XML ファイルへの LINQ を確立する
  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()

編集

複数の条件を 1 つの に組み合わせることができます.Where。たとえば、「1」の ID と「123456」の 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)一度宣言し、その後に条件を追加して、必要に応じて結合することAndですOr

于 2013-04-28T21:55:39.350 に答える