2

より複雑なクエリを指定できるように、LinqDataSource の OnSelecting メソッドを使用して最初の刺し傷を取り、次のように記述しました。

protected void CategoriesDataSource_OnSelecting(object sender, LinqDataSourceSelectEventArgs e)
    {
        using (DataLayerDataContext db = new DataLayerDataContext())
        {
            e.Result = (from feed in db.Feeds
                        where feed.FeedName.StartsWith("Google")
                        select feed.MainCategory).Distinct();
        }
    }

もちろん、問題は using 句が DataLayerDataContext を Dispose することです。「解決策」はそれなしで書くことですが、そうするとコンテキストがタイムリーに破棄されず、ガベージ コレクションが実行されるまで多数の接続が開いたままになるのではないかと心配しています。

私はこの分野の専門家ではないので、これが本当の問題なのか、それとも何も心配していないのかについて何かコメントはありますか?

4

1 に答える 1

3

ああ、遅延読み込みの不幸な副作用に悩まされている別の人...

protected void CategoriesDataSource_OnSelecting(object sender, LinqDataSourceSelectEventArgs e)
{
    using (DataLayerDataContext db = new DataLayerDataContext())
    {
        e.Result = (from feed in db.Feeds
                    where feed.FeedName.StartsWith("Google")
                    select feed.MainCategory).Distinct().ToList();
        //                                              ^^^^^^^^^
    }
}

これによりDataLayerDataContext、クエリがすぐに実行され、コンテキストや接続に依存しないインメモリ リストが作成されます。そうすれば、すぐに結果が得られ、いつでもコンテキストを破棄できます。

唯一の問題 (Steven のコメントによる) は、遅延ロードされたナビゲーション プロパティです。クエリを強制的に評価しても、他のLINQオブジェクト (または LINQ オブジェクトのリスト) への参照であるプロパティをクエリしようとするとDataLoadOptionsDataContext. 例については、以下を参照してください。

protected void CategoriesDataSource_OnSelecting(object sender, LinqDataSourceSelectEventArgs e)
{
    using (DataLayerDataContext db = new DataLayerDataContext())
    {
        DataLoadOptions loadOptions = new DataLoadOptions();
        loadOptions.LoadWith<Category>(c => c.SomeReference);
        loadOptions.LoadWith<Category>(c => c.SomeOtherReferences);

        db.LoadOptions = loadOptions;

        e.Result = (from feed in db.Feeds
                    where feed.FeedName.StartsWith("Google")
                    select feed.MainCategory).Distinct().ToList();
    }
}

これらの関連付けを手動で指定すると、LINQ to SQLLINQ to SQL はクエリの実行時にそれらを遅延読み込みのままにするのではなく、積極的にメモリに読み込みます (プロパティが破棄された後にプロパティが使用されると例外が発生しDataContextます)。

于 2011-08-28T01:52:22.447 に答える