这个场景经常出现,现在我使用了LinkToSql及其创建的类。
经典场景 - 两个表:
会员
ID
名称
...
成员
ID
会员ID(外键)
开始(日期时间)
到期时间(日期时间)
...
活跃的会员资格现在是在开始和到期之间。
要确定用户是否具有活动成员资格,我已创建此部分类以在LinkToSql生成的成员类上进行扩展:
Partial Public Class Member
Public ReadOnly Property HasActiveMembership() As Boolean
Get
Dim activeMembershipCount As Integer = (From m In Me.Memberships _
Where m.MemberId = Me.MemberId _
And m.StartDate < Now And m.ExpirationDate > Now() _
Select m).Count
If activeMembershipCount > 0 Then Return True Else Return False
End Get
End Property
End Class
这适用于一个成员,但是当我想列出700个成员并且他们是否拥有活跃成员资格时,它会对数据库进行700多次调用。
我应该如何更改我的模型/类?
我可以创建一个仅用于列表的查询,将整个事物组合成一个查询,这非常简单,但我想避免这样做,如果可以的话。
答案 0 :(得分:2)
你有几个选择;例如,您可以使用DataLoadOptions.LoadWith
或DataLoadOptions.AssociateWith
来急切地获取数据 - 但是,最佳方法取决于您使用它的方式。
例如,您可以编写“具有活动成员资格的用户”查询(使用Any
在LINQ中,或使用SPROC / UDF)。那将是1次往返,但可以说更少以对象为中心(以及更多以查询为中心)。哪个可能没事......
答案 1 :(得分:0)
看起来您已经定义了关联,可能是由于表之间的FK关系。在这种情况下,您可以使用已在类上定义的实体引用使用where子句扩展您的成员资格查询。
C#示例:
var query = db.Members.Where( m => m.Memberships
.Any( ms => ms.StartDate > now
&& ms.ExpirationDate < now ));