0

オブジェクト クエリを使用して、複数のエンティティ リレーションシップにわたってクエリを実行しようとしています。

エンティティ チェーンは、基本的に OMRMARKET (1 対多) PROPERTIES (1 対多) OMRBUILDINGSURVEYS (1 対多) PERIODS です。つまり、市場には多くのプロパティがあり、プロパティには多くの調査があり、調査には多くの期間があります。

次のオブジェクト クエリをフィルタリングします。

OMRMarketsQuery = OMRMarketsQuery.Include("Properties.OMRBuildingSurveys")

期間 ID (疑似コード) OMRMarket.Properties.OMRBuildingSurveys.PeriodID > 50

次に、次のような後続の Where 関数をネストできるのではないかと考えました。

OMRMarketsQuery = OMRMarketsQuery.Include("Properties.OMRBuildingSurveys").Where(
Function(m) m.Properties.Where(Function(p) p.OMRBuildingSurveys.Where(Function(s) 
s.PeriodID > 50)))

そして、そのクエリを構築するのに役立つインテリセンスのサポートを受けますが、エラーが発生します

タイプ 'System.Collections.Generic.IEnumerable(Of OMR.OMRInterfaceCustomCode.OMRBuildingSurvey)' の値を 'Boolean' に変換できません

どんな助けでも大歓迎です。私はこれが実行可能でなければならないことを知っています。よろしくお願いします。

4

2 に答える 2

0

答えは簡単です。

Eager Loading または Lazy Loading を使用している場合はフィルタリングできません。私自身と数人のフリーランサーがあらゆる種類の方法を試しましたが、答えは、市場とプロパティをロードしてから、次のコード行をコメントアウトすることでした:

'OMRMarketsQuery = OMRMarketsQuery.Include("Properties.OMRBuildingSurveys")

調査の詳細を読み込むために、プロパティ セレクタ リストボックスの変更イベントをキャッチしました。ここで、次のようにフィルタリングできます。

Private Sub Lbx_PropsByNameSelector_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles Lbx_PropsByNameSelector.SelectionChanged

    Dim propertyAdListBox = CType(sender, ListBox)
    Dim selectedProperty = CType(propertyAdListBox.SelectedItem, OMRInterfaceCustomCode.Property)

    If Not IsDBNull(selectedProperty) Then

        Dim RSurveysQuery = From r In OMRInterfaceEntities.OMRBuildingSurveys Where r.PeriodID > 80 And r.PropertyID = selectedProperty.ID

        Dim RSurveysList = RSurveysQuery.ToList

        If RSurveysList.Any() Then
            Dim RecentSurveysSource = CType(Me.FindResource("OMRMarketsPropertiesOMRBuildingSurveysViewSource"), CollectionViewSource)
            RecentSurveysSource.Source = RSurveysList
        End If
    End If

End Sub
于 2013-09-11T00:06:31.680 に答える