0

我使用实体框架作为 WPF 数据库前端的基础。

我的数据库结构适用于办公楼,对于这个问题,您需要了解的只是顶层实体称为市场(想想郊区或中央商务区)。市场有很多房产,房产有很多调查。

我想将返回的调查限制为仅最近的 10 次调查(调查每 6 个月进行一次)。

我可以看到自动生成的代码是如何构建查询的:

Dim OMRMarketsQuery As System.Data.Objects.ObjectQuery(Of OMR.OMRInterfaceCustomCode.OMRMarket) = OMRInterfaceEntities.OMRMarkets

    OMRMarketsQuery = OMRMarketsQuery.Include("Properties")

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

我想使用 where 子句过滤 OMRBuildingSurvey 实体的属性。我可以编写一个 where 子句来过滤市场(顶级实体)的 ID,如下所示:

MRMarketsQuery = OMRMarketsQuery.Include("Properties.OMRBuildingSurveys").Where("it.ID >1000")

但我想过滤 OMRBuildingSurveys 实体的属性,但我似乎找不到导航到它的方法。我努力了:

OMRMarketsQuery = OMRMarketsQuery.Include("Properties.OMRBuildingSurveys").Where("it.Properties.OMRBuildingSurvey.ID >1000")

但我得到了错误:

An unhandled exception of type 'System.Data.EntitySqlException' occurred in System.Data.Entity.dll

    Additional information: 'OMRBuildingSurvey' is not a member of 'Transient.collection[OMRInterfaceModel.Property(Nullable=True,DefaultValue=)]'. To extract a property of a collection element, use a subquery to iterate over the collection.

如果有人能指出我正确的方向,我将不胜感激!

非常感谢,祝您有美好的一天!

4

1 回答 1

-1

好的,答案很简单。

在使用 Eager Loading 或 Lazy Loading 时,您无法过滤。我和几个自由职业者尝试了各种方法,但答案是加载市场和属性,然后注释掉以下代码行:

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

为了加载调查详细信息,我们捕获了 Property Selector 列表框更改事件,我们可以在其中进行如下过滤:

Private Sub Lbx_PropsByNameSelector_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) 处理 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

结束子

于 2013-09-11T00:12:14.580 回答