0

現在、DataContextクラスのメソッドとしてLINQクエリを実装しています。このメソッドは、Wiki/CMS内のページに対してユーザーが持つ権限を計算します。私がやりたいのは、このメソッドをPageおよびUserLINQデータオブジェクトに再配置することです。

ただし、このクエリを個々のデータオブジェクトに移動すると、LINQtoSQLではなくLINQtoObjectsを使用して実行されます。これは、実行するたびにデータベースサーバーからいくつかの完全なコレクションを取得することを意味します。

これは、LINQtoObjectsを使用するコードのフラグメントです。LINQtoSQLを使用するには次のようにします。

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 }
            );
    }
}

これは、LINQtoSQLを使用して機能するコードのフラグメントです。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から実行すると、LINQ to SQLとして実行されますが、WikiPage LINQオブジェクトから実行すると、LINQtoObjectsとして実行されます。ここでの私の構文に何か問題がありますか、それともこれはLINQでは不可能ですか?

4

1 に答える 1

1

両方のコードセットで異なる動作が発生する理由は、「this」キーワードを使用しているためです。

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

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

于 2009-07-29T23:29:42.640 に答える