Ricerca 
it-ITen-US
Registrazione
Accedi
In-Vesti Dotnetwork
IN-VESTI DNW!!!
Sono finalmente arrivate le nuovissime T-Shirt di DotNetWork!!! Con soli 15,00 € ci sosterrai nelle spese di gestione della Community e ti invieremo a casa una splendida maglietta.
Se vuoi contribuire al mantenimento di DotNetWork.it Vai sulla pagina Iscrizioni
Effettua il pagamento usando IWBank
Click per andare alla pagina di Iscrizione
Oppure un Bonifico bancario (le coordinate sono sulla pagina Iscrizioni), inviaci una mail a support@dotnetwork.it indicandoci la tua taglia e l'indirizzo di spedizione.  Non appena verificata la ricezione del pagamento provvederemo a spedirti la tua T-Shirt.  Le magliette sono disponibili nelle taglie S-M-L-XL-XXL (in caso di esaurimento di una delle taglie, indica quella di "Backup"). Grazie per IN-VESTIRTI con NOI!!!
.:DotNetWork Founders:.
    Stampa     


DotNetWork Forums
LinqDataSource [VB.net 2008]
Ultimo Post 20 ott 2009 17.59 by Giovanni. 4 Risposte.
Stampa immediata
Ordina:
PrevPrev ProssimoProssimo
Non sei autorizzato ad inviare una risposta.
Autore Messaggi

Posts:54

--
19 ott 2009 20.29  
Salve a tutti. Ho questo quesito da proporre. Sto utilizzando un LinqDataSource per un GridView in una pagina Asp.Net che presenta 4 caselle di testo e 4 caselle di riepilogo. Questi ultimi controlli, che sono popolati con query linq, li utilizzo per filtrare i dati nel GridView. Seguendo i consigli trovati nella rete non ho avuto difficoltà, impostando la clausola AutoGenerateWhereClause a True, a filtrare i dati in base a singoli valori provenienti da una o più caselle di riepilogo. Il problema che mi si presenta, invece, è questo. E' possibile filtrare i dati abilitando le listBox alla multiselezione, quindi selezionando più valori da esse? Inoltre ho la necessità di filtrare gli stessi dati per intervalli di date e di ore inserite nelle 4 textBox della pagina. Per ottenere questo genere di filtro è' sempre possibile autogenerare la clausola Where o esiste un modo per crearla manualmente? Mi rendo conto di chiedere tanto, ma non so' più dove cercare. Quanto meno ho bisogno di uno spunto per andare avanti visto che non ho trovato nulla di simile né nei testi che ho acquistato (ne cito alcuni "Programmare Linq di Pialorsi e Russo, Microsoft Linq in V.b. 2008 di Del Sole, V.B. spiegato a mia nonna di De Ghetto ecc.), né su internet. Grazie per l'attenzione.
Tags: LinqDatasource

Posts:657

--
20 ott 2009 09.41  

Non preoccuparti, qui da noi sei nel posto giusto! ;-)
Allora: Per prima invece di usare un LinqDataSource devi usare direttamente il DataContext, altrimenti non puoi farlo, perché:
come seconda cosa: ne Linq To Sql, ne Linq to Entity implementano la clusola del database "IN".
Quindi se provi a prendere i dati dal datacontext nel seguente modo:

N.B: Nel codice seguente ho sostituito la parentesi angolare aperta con un "$" altrimenti non si vedeva sul post, per questioni hi HTML...

-------------------------------------
NorthwindDataContext nw = new NorthwindDataContext();
String[] myValues = new String[] { "London", "Madrid", "Buenos Aires" };

var qry = from t in nw.Customers
               join val in myValues on t.City equals val
               select t;

Ottieni il seguente errore:
System.NotSupportedException was unhandled
  Message="Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains() operator."
-------------------------------------

Questo perchè l'espressione che verrebbe generata non è supportata (lo sarà col NET Framework 4.0).
Per ovviare a questo inconveniente devi crearti tu un l'espressione corretta e lo fai con la seguente funzione (che è scritta in c# e se qualche anima buona vuole tradurtela in VB...):

-------------------------------------
public static Expression$Func$TElement, bool>> BuildContainsExpression$TElement, TValue>(
   Expression$Func$TElement, TValue>> valueSelector, IEnumerable$TValue> values)
 {
  if (null == valueSelector) { throw new ArgumentNullException("valueSelector"); }
  if (null == values) { throw new ArgumentNullException("values"); }
  ParameterExpression p = valueSelector.Parameters.Single();
  if (!values.Any())
  {
   return e => false;
  }
  var equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
  var body = equals.Aggregate$Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
  return Expression.Lambda$Func$TElement, bool>>(body, p);
 }
-------------------------------------

Ora hai tutti gli elementi per fare ciò che ti server:

Al page load carichi i dati da tuo datacontext:

-------------------------------------
protected void Page_Load(object sender, EventArgs e)
    {
  if (!IsPostBack)
  {
   DataClassesDataContext dtc = new DataClassesDataContext();
   GridView1.DataSource = dtc.TbContattis;
   GridView1.DataBind();
  }
    }
-------------------------------------

Metti un bottone e all'evento click usi il seguente codice:

protected void Button1_Click(object sender, EventArgs e)
 {
  DataClassesDataContext dtc = new DataClassesDataContext();

  List$String> filtri = new List$string>();

  //Qui scorri gli elementi selezionati sulla tua listbox e li aggiungi alla collezione "filtri":
  filtri.Add(elemento1);
  filtri.Add(elemento2);
  filtri.Add(elementoN ...);

  GridView1.DataSource = dtc.NomeTabella.Where(BuildContainsExpression$NomeTabella,
     string>(exp => exp.CampoTabella, filtri));

  GridView1.DataBind();
 }

Stessa cosa per i campi data e ora, puoi passare a filtri una stringa: "dd/MM/yyyy hh:mm:ss".

Buon divertimento!

Rudy Azzan

Posts:54

--
20 ott 2009 11.21  
Intanto veramente grazie. Effettivamente necessito proprio della traduzione dell'espressione in Vb.net, altrimenti per me è veramente difficile capire.
A presto.
Giovanni Puglisi

Posts:657

--
20 ott 2009 13.47  

Ecco la versione VB:
Ringraziando: Chris Baran @ Rockfish Interactive

 Public Shared Function BuildContainsExpression(Of TElement, TValue)( _
         ByVal valueSelector As Expression(Of Func(Of TElement, TValue)), _
         ByVal values As IEnumerable(Of TValue) _
            ) As Expression(Of Func(Of TElement, Boolean))

            ' validate arguments
            If IsNothing(valueSelector) Then Throw New ArgumentNullException("valueSelector")
            If IsNothing(values) Then Throw New ArgumentNullException("values")

            Dim p As ParameterExpression = valueSelector.Parameters.Single()
            If Not values.Any Then
                Return _
                    Function(e) False
            End If

            Dim equals = values.Select( _
                Function(v) _
                    Expression.Equal(valueSelector.Body, Expression.Constant(v, GetType(TValue))) _
            )

            Dim body = equals.Aggregate( _
                Function(accumulate, equal) _
                    Expression.Or(accumulate, equal) _
            )

            Return Expression.Lambda(Of Func(Of TElement, Boolean))(body, p)
        End Function

Rudy Azzan

Posts:54

--
20 ott 2009 17.59  
Funziona tutto alla perfezione! Davvero grazie tante. Sei stato molto prezioso e, soprattutto, paziente.
Giovanni Puglisi
Non sei autorizzato ad inviare una risposta.

Active Forums 4.1
       
Articoli
Codedom Introduzione all'uso parte3
La classe Helper per le funzionalità CodeDom
2009/11/07 | Autore: Sabna Cosolo
Fritto Misto - Classi di uso comune (Parte 6)
Helper: Alcuni metodi per organizzarci nell'uso del file System
2007/10/28 | Autore: Sabrina Cosolo
Visual Studio LightSwitch Beta 1 - Installazione
La procedura di installazione e le risorse sul web
2010/08/24 | Autore: Mario De Ghetto
Addin per Live Writer
Programmer Paster, un Addin per Live Writer che colora il codice sorgente inserito nei Post dei Blog
2007/11/11 | Autore: Rudy Azzan
Fritto Misto - Classi di uso comune(parte 3)
Helper: Due interfacce per implementare classi Entity
2007/10/22 | Autore: Sabrina Cosolo
SQL Server Nozioni base (parte 1)
Come creare un database in SQL Server Usando Sql Management Studio
2008/03/09 | Autore: Sabrina Cosolo
Iniziare da zero con WPF (Parte 3)
Litigi, Divinità, Pennelli e Frigoriferi. (prima parte)
2007/11/22 | Autore: Sabrina Cosolo
Iniziare da zero con WPF (Parte 3)
Litigi, Divinità, Pennelli e Frigoriferi. (seconda parte)
2007/11/22 | Autore: Sabrina Cosolo
    Stampa     
Home|Forums|Blogs|Mappa del sito
© 2007-2010 by DotNetWork  .:.  Condizioni d'uso  .:.  Privacy  .:.  Accedi  .:.