2012-05-05 8 views
1

これは基本的な質問であり、正確な検索条件が不足しているために回答が見つからないと思います。ASP.NET 4.0 dropDownListを選択パラメータとして使用 - データベースに送信されるクエリを最小限にする

私が取り組んでいるデータベースには、わずか約6行5フィールドの小さなテーブルが含まれています。 CRUD機能は時折変更されるため、CRUD機能は必要ですが、十数行を超えることはほとんどありません。

ASP.NET Webアプリケーションには、ビジネスロジックとデータアクセスレイヤがあります。

詳細ビューに表示する行を選択するために、擬似「ページング」コントロールとしてdropDownListを使用したいとします。このような類似のために二回、これは動作しますが

<asp:ObjectDataSource ID="DDDataSource" runat="server" TypeName="PICUdrugs.BLL.referenceBL" 
SelectMethod="getReferences"/> 
<asp:DropDownList ID="RefAbrevDDL" runat="server" AutoPostBack="True" 
    DataTextField="abbrev" DataSourceID="DDDataSource" 
    DataValueField="drugReferenceID" ViewStateMode="Enabled" > 
</asp:DropDownList> 

<asp:ObjectDataSource ID="SelRefObjDataSrc" runat="server" SelectMethod="getReferences" 
UpdateMethod="updateReference" DeleteMethod="deleteReference" TypeName="PICUdrugs.BLL.referenceBL" 
OnUpdated="reference_CRUD" DataObjectTypeName="PICUdrugs.DAL.drugReference" 
ConflictDetection="CompareAllValues" OldValuesParameterFormatString="orig{0}"> 
    <SelectParameters> 
     <asp:controlparameter name="refID" controlid="RefAbrevDDL" propertyname="SelectedValue"/> 
    </SelectParameters> 
</asp:ObjectDataSource> 
<asp:ValidationSummary ID="ValidationSummary1" runat="server" /> 
<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataSourceID="SelRefObjDataSrc" 
    CssClass="DetailView"> 
    <Fields> 
     <asp:DynamicField DataField="referenceDescription" HeaderText="Reference Description" /> 
     .....[remaining fields]..... 

、それは私がデータベースを照会していますことを私に気:

迅速かつ厄介なソリューションのソリューションは、選択パラメータでASP、1に2つのObjectDataSourceコントロールを配置することです情報。 objectDataSourceを利用する(つまり、DetailsViewに特定のイベントハンドラを記述する必要がない)、単一のデータベースクエリで列挙可能なリストを作成し、両方のコントロールが同じオブジェクトにアクセスするようにする効率的ですっきりしたソリューションはありますか?詳細ページング制御を表示しますか?)コードの背後にはC#ですが、誰かが例やリンクを持っていればvbでも問題ありません。

考えていただきありがとうございます(これらの考えが怠け者である場合でも、両方のobjectDataSourcesを削除し、detailsviewイベントハンドラを手動で書き込むだけです)。

答えて

0

方法を考え出したが、それが感じられる場合は、代替を投稿してください、これは少しハックで、またはより良い解決策が存在します。

Webページの分離コードファイルには、なるようにプライベート変数を設定最初が使用するのと同じ可算リストにプライベート変数ポインティングを持っている、グレードってこんなモン層で

private referenceBL persistentRef; 
    protected void DDDataSource_ObjCreated(object sender, ObjectDataSourceEventArgs e) 
    { 
     persistentRef = e.ObjectInstance as referenceBL; 
    } 
    protected void SelRefObjDataSrc_ObjCreating(object sender, ObjectDataSourceEventArgs e) 
    { 
     if (persistentRef!=null) 
     { 
      e.ObjectInstance = persistentRef; 
     } 
    } 

:グレードってこんなモン層オブジェクトへの参照は、ページのビルド・サイクルを持続し、オブジェクト作成し、作成したイベントハンドラを設定しますオブジェクトデータソース、およびそのように選択を処理します。

private IEnumerable<drugReference> persistingRef; 
    public IEnumerable<drugReference> getReferences() 
    { 
     persistingRef = DrugRefRepository.getReferences(); 
     return persistingRef; 
    } 
    public IEnumerable<drugReference> getReferences(int refID) 
    { 
     if (persistingRef == null) 
     { 
      return DAL.DrugRefRepository.getReferences(refID); //data access layer method 
     } 
     else 
     { 
      return persistingRef.Where(r => r.drugReferenceID==refID); 
     } 
    } 

もちろん、ビジネスオブジェクトの廃棄は、データベース接続をすぐに閉じるために手動で処理する必要があります。

listView内のネストされた(埋め込み)objectDataSourceに同じ戦略を適用して、更新と削除の機能が存在するようにしますが、データベースの呼び出し回数を最小限に抑えたいと考えています。

関連する問題