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

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.