Modificare i criteri della clausola Where del LinqDataSource di ASP.NET

di Marco Leoncini, in ASP.NET 3.5, LinqDataSource, DataBinding,

Il controllo LinqDataSource consente l'utilizzo di LINQ (Language Integrated Query) sfruttando semplice markup per interrogare, aggiungere, modificare o eliminare elmenti di una qualsiasi collezione di oggetti, che utilizzando LINQ to SQL vengono persistiti su un database SQL Server.
In particolare attraverso la proprietà Where è possibile specificare le condizioni da soddisfare per la selezione dalla sorgente dati.
Nel nostro esempio impostando la proprietà AutoGenerateWhereClause a true, la clausola Where è generata dinamicamente in base al contenuto della collezione WhereParameters, concatenando con l'operatore "AND" i vari campi e confrontando i rispettivi valori applicando sempre la condizione di uguaglianza.

In alcuni casi può essere necessario modificare a runtime la clausola Where per escludere uno o più criteri, in modo da estendere la ricerca.
Prendiamo ad esempio un LinqDataSource così configurato:

<asp:LinqDataSource ID="RentListLinqDataSource" runat="server" ContextTypeName="MyDataContext" TableName="Rents" AutoGenerateWhereClause="true" OnSelecting="RentListLinqDataSource_Selecting">
  <WhereParameters>
    <asp:ControlParameter ControlID="RentLocationDropDownList" Name="RentLocationID" PropertyName="SelectedValue" Type="Int32" />
    <asp:ControlParameter ControlID="RentTypeDropDownList" Name="RentTypeID" PropertyName="SelectedValue" Type="Int32" />
    <asp:ControlParameter ControlID="RifTextBox" Name="Rif" Type="String" />
  </WhereParameters>
</asp:LinqDataSource>

Per modificare la clausola Where ed i criteri di selezione è sufficente creare un event handler per l'evento Selecting e modificare, rimovendo uno o più parametri dalla collezione WhereParameters, tale collezione che è passata come argomento al metodo mediante LinqDataSourceSelectEventArgs.
Non è necessario fare altro poiché sarà il LinqDataSource a generare la clausola Where in base ai parametri rimasti.

protected void RentListLinqDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
  // azzero i parametri
  if (RentLocationDropDownList.SelectedValue == "0" & RentTypeDropDownList.SelectedValue == "0" & string.IsNullOrEmpty(RifTextBox.Text.Trim()))
  {
    e.WhereParameters.Clear();
    return;
  }
  
  //non è necessario filtrare per il tipo
  if (RentTypeDropDownList.SelectedValue == "0")
  {
    e.WhereParameters.Remove("RentTypeID");
  }
  
  //non è necessario filtrare per la collocazione
  if (RentLocationDropDownList.SelectedValue == "0")
  {
    e.WhereParameters.Remove("RentLocationID");
  }
  
  //non è necessario filtrare per il riferiemtno
  if ( string.IsNullOrEmpty(RifTextBox.Text.Trim()))
  {
    e.WhereParameters.Remove("Rif");
  }
}

Nell'esempio precedete sono rimossi uno o più parametri dalla collezione WhereParameters in base a i valori immessi nell'interfaccia di ricerca, composta da due DropDownList ed una TextBox.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi