0

我目前有一个 LINQ 查询作为我的 DataContext 类的方法实现。此方法计算用户对 Wiki/CMS 中的页面的权限。我想做的是将此方法重新定位到 Page 和 User LINQ 数据对象。

但是,当我将此查询移动到单个数据对象时,它使用 LINQ to Objects 而不是 LINQ to SQL 执行。这意味着它每次执行时都会从数据库服务器中提取几个完整的集合。

这是使用 LINQ to Objects 的代码片段。我希望这个使用 LINQ to SQL:

partial class WikiPage
{
    public void GetUserPermissions(Guid? userId) {
        var usersPlusAnon =
            (
                from user in this.Wiki.WikiWikiUsers
                select new { user.WikiId, WikiUserId = (Guid?)user.WikiUserId }
            ).Union(
                from wiki in new Wiki[]{this.Wiki}
                select new { wiki.WikiId, WikiUserId = (Guid?)null }
            );
    }
}

这是使用 LINQ to SQL 的代码片段。我宁愿在 WikiPage 类上使用此方法,而不是 DataContext:

partial class WikiDataContext
{
    public void GetUserPermissions(Guid? userId) {
        var usersPlusAnon =
            (
                from user in this.WikiTomeUsers
                join wikiUser in this.WikiWikiTomeUsers on user.WikiTomeUserId equals wikiUser.WikiTomeUserId into tmp_wikiUser
                from wikiUser in tmp_wikiUser.DefaultIfEmpty()
                select new { WikiId = wikiUser.WikiId, WikiTomeUserId = (Guid?)wikiUser.WikiTomeUserId }
            )
            .Union(
                from wiki in this.Wikis
                select new { WikiId = wiki.WikiId, WikiTomeUserId = (Guid?)null }
            );
    }
}

从 DataContext 运行 LINQ 查询时,它作为 LINQ to SQL 执行,但从 WikiPage LINQ 对象运行时,它作为 LINQ to Objects 运行。我的语法在这里有问题,还是 LINQ 根本不可能?

4

1 回答 1

1

您从两组代码中获得不同行为的原因是因为您使用了“this”关键字。

当您将代码编写为数据上下文的一部分时,它使用 DataContext 对象中的 LINQ to SQL 类(因为“this”关键字指向 DataContext)。

如果您希望 DataContext 之外的代码使用 LINQ to SQL,则必须将对“this”的引用更改为 WikiDataContext 的实例。然后它应该使用 LINQ to SQL 从数据库中提取数据,而不是使用 LINQ to Objects。

于 2009-07-29T23:29:42.640 回答