2009-07-29 13 views
0

私は現在、自分のDataContextクラスのメソッドとして実装されているLINQクエリを持っています。このメソッドは、ユーザーがWiki/CMS内のページに対して持つ権限を計算します。私がしたいのは、このメソッドをページとユーザーのLINQデータオブジェクトに再配置することです。LINQオブジェクト内からLINQ to SQLクエリを実行できますか?

ただし、このクエリを個々のデータオブジェクトに移動すると、LINQ to SQLの代わりにLINQ to Objectsを使用して実行されます。つまり、実行するたびにデータベースサーバーからいくつかのフルコレクションを取得します。

次は、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を使用して動作するコードの断片です。私はむしろのDataContextよりWikiPageクラスでこのメソッドがあるだろう:

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のから実行され、それがSQLにLINQとして実行されますが、WikiPage LINQから実行したとき、それはとして実行オブジェクトオブジェクトへのLINQ。ここで私の構文に何かがあるのですか、これは単にLINQでは不可能ですか?

+0

あなたの質問は、どのコードがどの結果を生成しているか少し混乱しています...それぞれを(LINQ to SQLとLINQ to Objects)別々に行うコードを少しずつ明確にすることができますか? –

+0

@Justin Niessner Done ...コードは同じですが、唯一の違いはDataContextクラスかLINQオブジェクトのどちらから実行されるかです。 – AaronSieb

+0

最初の例でthis.WikiはDataContextですか? –

答えて

1

'this'キーワードを使用しているため、両方のコードセットから異なる動作を得る理由があります。

データコンテキストの一部としてコードを記述すると、DataContextオブジェクトのLINQ to SQLクラスが使用されます( 'this'キーワードはDataContextを参照しているため)。

DataContext以外のコードでLINQ to SQLを使用する場合は、「this」への参照をWikiDataContextのインスタンスに変更する必要があります。次に、LINQ to SQLを使用して、LINQではなくデータベースからデータを取得します。

+0

LINQオブジェクト内から関連するデータコンテキストを参照するにはどうすればよいですか? – AaronSieb

+0

WikiDataContextコンテキスト=新しいWikiDataContext(); –

+0

ああ、もちろん。返品結果が変更され保存された場合、私は潜在的な競合について考えていましたが、この場合は適用されません。 – AaronSieb

関連する問題