0

データベースからいくつかの結果を渡す必要があります。データセット全体または構築されたSQLクエリを渡す代わりに、LinqDataSourceで構成されたオブジェクトを渡そうとしました。

ソースページで、ページに表示されるコントロール(検索ボックス、コンボボックスなど)でユーザーが設定した値を使用して、LinqDataSourceオブジェクトのプロパティWhereおよびWhereParametersを構成します。レシーバーページでのLinqDataSourceの再構成を回避するために、オブジェクトを渡します。

しかし、開発中のシステムでは正常に機能していても、専用サーバーにデプロイした後、次のようなエラーが発生しました。

破棄されたオブジェクトにアクセスできません。

オブジェクト名:'Disposeの後にアクセスされるDataContext。'。

ソースとレシーバーの両方のページで、LinqDataSourceオブジェクトは次のように宣言されます。

<asp:LinqDataSource ID="myLinqDS" runat="server" 
    ContextTypeName="MyProject.MyDBNamedpace.MyDataContext" 
    TableName="TheTable"
    OrderBy="field1, field2"
</asp:LinqDataSource>

データソースオブジェクトを渡すには、次のようにします。

SetLinqDataSourceWhereAndHisParameters(); //just set Where and WhereParameters
Guid guid = Guid.NewGuid();
Session[guid.ToString()] = myLinqDS;
ScriptManager.RegisterStartupScript(this.Page,
    typeof(Page),
    "Redirect",
    String.Format(@"window.open(""{0}"");",
        this.ResolveClientUrl("~/PageToDisplayTheData.aspx?guid=" +
        System.Web.HttpUtility.UrlEncode(guid.ToString())
    ),
true);

そして、取得するには、PageToDisplayTheData.aspxのコードビハインドで:

myLinqDS =
   (LinqDataSource)Session[System.Web.HttpUtility.UrlDecode(Request.QueryString[guid])];
aDataList.DataSource = myLinqDS;
aDataList.DataBind();
4

3 に答える 3

2

次の理由により、DataContext を Session (またはどこにも) に格納しないでください。

  • DataContext はスレッド セーフではありません
  • DataContext は Unit-Of-Work ツールとして設計されています

DataContext 内でコレクションにクエリを実行すると、コレクションは内部的にキャッシュされるため、再クエリを実行してもデータベースへのラウンドトリップは発生しません。しかし、これは、基礎となるデータベースの実際の状態を値が反映していないため、データの停滞につながる可能性があります。

于 2009-01-20T08:24:24.873 に答える
0

プロパティをあるオブジェクトから別のオブジェクトにコピーするだけで機能しました。

LinqDataSource received=
(LinqDataSource)Session[System.Web.HttpUtility.UrlDecode(Request.QueryString[guid])];

myLinqDS.Where = received.Where;
foreach (Parameter p in received.WhereParameters)
    myLinqDS.WhereParameters.Add(p);

しかし、IIS を実行しているメイン サーバーではなく、なぜ VS2008 内部 Web サーバーでは機能したのかはまだわかりません。

于 2009-01-19T17:44:26.693 に答える
0

あなたの目標は何ですか?アプリケーションがデータベースに戻る必要がないようにしたい場合は、とにかくデータセット全体をキャッシュする必要があります。クエリを再作成する必要がないようにするだけの場合は、クエリをデータ コンテキストにメソッドとして追加し、そこからどこからでも参照してみませんか。

public partial class MyDataContext
{
    public Table<MyTable> OrderedTable()
    {
         return this.TheTable.OrderBy( t => t.field1 )
                             .ThenBy( t => t.field2 );
    }
}
于 2009-01-19T15:53:38.790 に答える