2009-07-29 124 views
0

我目前有一个LINQ查询作为我的DataContext类的一个方法实现。此方法计算用户对Wiki/CMS中页面的权限。我想要做的是将此方法重新定位到页面和用户LINQ数据对象。我可以从LINQ对象内执行LINQ to SQL查询吗?

但是,当我将此查询移动到单个数据对象时,它将使用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工作的代码片段。我宁愿对wiki页面类比的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 } 
      ); 
    } 
} 

当LINQ查询从DataContext的运行,它执行的LINQ to SQL的,但是从wiki页面LINQ运行对象时,它运行的LINQ到对象。我的语法在这里有什么用处,或者这对LINQ来说是不可能的?

+0

你的问题是有点混淆,哪些代码产生的结果...你可以给我们的代码,每个(LINQ到SQL与LINQ到对象)单独使它更清晰一点吗? – 2009-07-29 23:21:25

+0

@Justin Niessner完成...代码是一样的,唯一的区别是它是从DataContext类还是LINQ对象运行。 – AaronSieb 2009-07-29 23:26:42

回答

1

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

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

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