LinqToSql - 避免对数据库的过多查询

时间:2009-05-27 11:53:17

标签: .net performance linq-to-sql

这个场景经常出现,现在我使用了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多次调用。

我应该如何更改我的模型/类?

我可以创建一个仅用于列表的查询,将整个事物组合成一个查询,这非常简单,但我想避免这样做,如果可以的话。

2 个答案:

答案 0 :(得分:2)

你有几个选择;例如,您可以使用DataLoadOptions.LoadWithDataLoadOptions.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 ));