ユーザーがコレクションの「フィルター」に入力できるグリッドがあります。ユーザーはいくつかの列に入力する必要があります。
AndOr Property Comparator Value
たとえば、Citiesコレクションの場合、次の都市をフィルタリングできます。
- Name StartsWith 'a'
AND Population > 10000
OR Population < 1000
「ブラケット」要件が表示されるまで、非常にうまく機能する動的PredicateBuilderを使用しました。
上記の「クエリ」からわかるように、結果のコレクションには、次のような都市が含まれ
(Name.StartsWith'a' AND Population > 10000) OR (Population < 1000)
ます。
式
Name.StartsWith'a' AND (Population > 10000 OR (Population < 1000)
を作成するには、角かっこを使用する必要があります。
これで、フィルターグリッド列が次のように変更されました。
AndOr LeftBracket Property Comparator Value RightBracket
.NET動的式ライブラリに「グループ」、「Open / CloseBracket」はありますか?それを実現する別の方法は?
それらの間の行を「リンク」するコードは次のとおりです。
Private Function GetMyObjectsDataSource() As IQueryable(Of MyObject)
' start without any filter, get it all '
Dim predicate = PredicateBuilder.True(Of MyObject)()
Dim filterExpression As Expression(Of Func(Of MyObject, Boolean)) = predicate
For Each row In grdFilter.Rows
Dim rowExpression = GetExpressionFromRow(Of MyObject)(row)
Dim compOp As LogicalOperator = row.Cells(ColumnKeys.AndOr).Value
If compOp = LogicalOperator.Or Then
filterExpression = [Or](filterExpression, rowExpression)
Else
filterExpression = [And](filterExpression, rowExpression)
End If
Next row
Dim myObjects As List(Of MyObject) = Me._Container.GetMyObjects()
Dim result As IQueryable(Of MyObject) =
myObjects.AsQueryable().Where(filterExpression)
Return result
End Function