Condividi tramite


Procedura dettagliata: selezione e applicazione di filtri a un sottoinsieme di dati con i controlli LinqDataSource e GridView

Aggiornamento: novembre 2007

In questa procedura dettagliata viene descritto come utilizzare il controllo LinqDataSource per creare un insieme di dati che non sia limitato ai valori di una singola tabella di database. Verrà utilizzato un controllo LinqDataSource per selezionare un sottoinsieme di dati dalla tabella, calcolare nuovi valori dai valori selezionati e recuperare i valori dalle tabelle correlate. Verranno inoltre applicati filtri per determinare i record da restituire. Verrà quindi visualizzato un nuovo insieme di valori utilizzando un controllo GridView.

Nella procedura dettagliata viene illustrato l'accesso ai dati selezionando i valori principalmente dalla tabella Product del database di esempio AdventureWorks. La tabella Product contiene colonne che rappresentano le chiavi esterne ad altre tabelle e verranno recuperati i dati da tali tabelle correlate.

Verrà utilizzato Object Relational Designer per creare una classe che rappresenti le tabelle di database contenenti i valori. Il controllo LinqDataSource interagirà con questa classe generata per recuperare e aggiornare i dati.

Prerequisiti

Per implementare le procedure illustrate in questa procedura dettagliata è necessario:

  • Visual Studio 2008 o Visual Web Developer Express Edition.

  • Un sito Web ASP.NET.

  • SQL Server Express Edition. Se è stato installato SQL Server, è possibile utilizzare tale applicazione, ma sarà necessario apportare piccole modifiche ad alcune procedure.

  • Database AdventureWorks installato nel computer. Per scaricare il database AdventureWorks, vedere SQL Server 2005 Samples and Sample Databases (informazioni in lingua inglese).

  • Stringa di connessione nel sito Web per connettersi al database AdventureWorks.

Creazione di classi per rappresentare le entità di database

Per utilizzare i dati del database utilizzando il controllo LinqDataSource, è necessario creare le classi che rappresentano le entità di database. Per creare queste classi, è possibile utilizzare uno strumento disponibile in Visual Studio 2008.

Per creare le classi per le tabelle di database AdventureWorks

  1. Se il sito Web non dispone già di una cartella App_Code, in Esplora soluzioni fare clic con il pulsante destro del mouse sul nome del progetto, scegliere Aggiungi cartella ASP.NET, quindi App_Code.

  2. Fare clic con il pulsante destro del mouse sulla cartella App_Code, quindi scegliere Aggiungi nuovo elemento.

    Verrà visualizzata la finestra di dialogo Aggiungi nuovo elemento.

  3. In Modelli Visual Studio installati selezionare Classi LINQ to SQL, denominare il file AdventureWorks.dbml, quindi fare clic su Aggiungi.

    Verrà visualizzata la finestra Progettazione relazionale oggetti.

  4. In Esplora server trascinare la tabella Product (Production) nella finestra Progettazione relazionale oggetti.

    La tabella Product (Production) e le relative colonne sono rappresentate nella finestra di progettazione come entità denominata Product.

  5. Trascinare la tabella ProductSubCategory e la tabella UnitMeasure nella finestra di progettazione.

    Queste tabelle e le relative colonne sono rappresentate come entità nella finestra di progettazione. La relazione tra Product e le due tabelle correlate viene visualizzata con una linea tratteggiata.

  6. Salvare il file AdventureWorks.dbml.

  7. In Esplora soluzioni aprire il file AdventureWorks.designer.cs o AdventureWorks.designer.vb.

    Il file contiene le classi denominate AdventureWorksDataContext, Product, ProductSubCategory e UnitMeasure. La classe Product contiene le proprietà denominate ProductSubcategory, UnitMeasure e UnitMeasure1. Queste proprietà vengono contrassegnate come chiavi esterne mediante l'attributo AssociationAttribute. Restituiscono gli oggetti che rappresentano le tabelle ProductSubCategory e UnitMeasure.

    La proprietà UnitMeasure rappresenta la relazione di chiave esterna per il valore della colonna SizeUnitMeasureCode. La proprietà UnitMeasure1 rappresenta la relazione di chiave esterna per il valore della colonna WeightUnitMeasureCode.

Selezione delle colonne da recuperare

Se non si specifica un valore per la proprietà Select, il controllo LinqDataSource restituisce tutte le proprietà (colonne) dalla classe che rappresenta la tabella di database.

Per recuperare un sottoinsieme di dati con il controllo LinqDataSource

  1. In Visual Studio creare una nuova pagina Web ASP.NET e passare alla visualizzazione Origine.

  2. Dalla scheda Dati della casella degli strumenti, trascinare un controllo LinqDataSource e rilasciarlo nell'elemento form della pagina Web.

    È possibile lasciare LinqDataSource1 come valore per la proprietà ID.

  3. Impostare la proprietà ContextTypeName su AdventureWorksDataContext.

    La classe AdventureWorksDataContext è una classe di contesto dati che rappresenta il database AdventureWorks. Contiene una proprietà per ogni tabella presente nel database.

  4. Impostare la proprietà TableName su Products.

  5. Impostare la proprietà Select su:

    new(Name, Size, StandardCost, ListPrice, DaysToManufacture)
    

    Impostando la proprietà Select, è possibile limitare le proprietà recuperate dalla classe Products. Quando si selezionano più proprietà da una classe, è necessario racchiudere le proprietà nell'operatore new, poiché il controllo LinqDataSource non restituisce un'istanza della classe specificata nella proprietà TableName. Restituisce invece un'istanza di una classe creata dinamicamente contenente solo queste proprietà.

Applicazione di filtri per determinare i record da recuperare

Se non si specifica un valore per la proprietà Where, il controllo LinqDataSource restituisce tutti record dalla tabella di database. È possibile filtrare i record da restituire impostando la proprietà Where. È possibile filtrare in base a un valore statico, ad esempio ListPrice > 0, in modo da restituire solo i record contenenti un valore maggiore di zero nella proprietà ListPrice. È inoltre possibile assegnare un valore in fase di esecuzione aggiungendo i parametri all'insieme WhereParameters.

Per filtrare i dati in fase di esecuzione con il controllo LinqDataSource

  1. Aggiungere un controllo DropDownList alla pagina Web e impostare la relativa proprietà AutoPostBack su true.

    Lasciare il nome predefinito DropDownList1.

  2. Aggiungere quattro elementi dell'elenco al controllo DropDownList1 e impostarne i valori su 0, 25, 100 e 400.

  3. Aggiungere un elemento WhereParameters tra i tag di apertura e chiusura del controllo LinqDataSource.

  4. Aggiungere un controllo ControlParameter all'insieme WhereParameters.

  5. Impostare la proprietà ControlID del controllo ControlParameter su DropDownList1, la proprietà Name su SelectedPrice e la proprietà Type su Int32.

    In fase di esecuzione il parametro SelectedPrice conterrà il valore selezionato da DropDownList1.

  6. Impostare la proprietà Where su ListPrice > @SelectedPrice per selezionare solo i record il cui valore ListPrice sia maggiore del valore selezionato dall'utente.

    Nell'esempio seguente viene illustrato il markup dichiarativo per i controlli DropDownList e LinqDataSource.

    <asp:DropDownList AutoPostBack="true" ID="DropDownList1" >
      <asp:ListItem Value="0"></asp:ListItem>
      <asp:ListItem Value="25"></asp:ListItem>
      <asp:ListItem Value="100"></asp:ListItem>
      <asp:ListItem Value="400"></asp:ListItem>
    </asp:DropDownList>
    <asp:LinqDataSource 
      ContextTypeName="AdventureWorksDataContext" 
      TableName="Products" 
      Where="ListPrice > @SelectedPrice" 
      Select="new(Name, Size, StandardCost, ListPrice, DaysToManufacture)" 
      ID="LinqDataSource1" 
      >
      <WhereParameters>
        <asp:ControlParameter 
          Name="SelectedPrice" 
          DefaultValue="0" 
          ControlID="DropDownList1" 
          Type="Int32" />
      </WhereParameters>
    </asp:LinqDataSource>
    

Aggiunta di un controllo per la visualizzazione dei dati

È possibile ora aggiungere un controllo GridView e associarlo al controllo LinqDataSource. Il controllo GridView consente agli utenti di visualizzare righe di dati gestite dal controllo LinqDataSource. Si consentirà agli utenti di ordinare e spostarsi tra i dati.

Per visualizzare il sottoinsieme di dati nel controllo GridView

  1. Nella scheda Dati della Casella degli strumenti fare doppio clic sul controllo GridView per aggiungerlo alla pagina.

  2. Impostare la proprietà DataSourceID del controllo GridView su LinqDataSource1

    In questo modo il controllo GridView viene associato ai dati restituiti dal controllo LinqDataSource.

  3. Impostare le proprietà AllowPaging e AllowSorting su true.

    Per utilizzare le funzioni di ordinamento e spostamento con un controllo LinqDataSource, è necessario che le proprietà AutoSort e AutoPage siano impostate su true. Per impostazione predefinita, entrambi questi valori sono true.

  4. Impostare la proprietà AutoGenerateColumns su false.

  5. Per specificare l'ordine delle colonne, creare un controllo BoundField per ogni proprietà (Name, Size, StandardCost, ListPrice e DaysToManufacture) specificata nella proprietà Where del controllo LinqDataSource.

    Nell'esempio seguente viene illustrato il markup dichiarativo per il controllo GridView:

    <asp:GridView 
      AllowPaging="true" 
      AllowSorting="true" 
      AutoGenerateColumns="false" 
      DataSourceID="LinqDataSource1" 
      ID="GridView1" 
      >
      <Columns>
        <asp:BoundField 
            DataField="Name" 
            HeaderText="Name" 
            SortExpression="Name" />
        <asp:BoundField 
            DataField="Size" 
            HeaderText="Size" 
            SortExpression="Size" />
        <asp:BoundField 
            DataField="StandardCost" 
            HeaderText="Standard Cost" 
            SortExpression="StandardCost" />
        <asp:BoundField 
            DataField="ListPrice" 
            HeaderText="List Price" 
            SortExpression="ListPrice" />
        <asp:BoundField 
            DataField="DaysToManufacture" 
            HeaderText="Days To Manufacture" 
            SortExpression="DaysToManufacture" />
      </Columns>
    </asp:GridView>
    
  6. Salvare la pagina e premere CTRL+F5 per visualizzare la pagina in un browser.

    Nel controllo GridView vengono visualizzate le colonne per i record correnti dalla tabella Product. Per ordinare i record, fare clic sulle intestazioni di colonna, mentre per spostarsi tra i record fare clic sui numeri di pagina.

Utilizzo dei valori dell'origine dati per calcolare i nuovi valori

Oltre a selezionare i valori dalla tabella di database, è possibile calcolare nuovi valori. Ciò può essere utile per visualizzare un valore che può essere derivato solo eseguendo un calcolo su un valore dall'origine dati. È quindi possibile visualizzare tali valori nel controllo GridView.

Per calcolare e visualizzare nuovi valori da un'origine dati

  1. Modificare il valore della proprietà Select impostandolo su:

    new(Name, 
        Size, 
        StandardCost, 
        ListPrice, 
        ListPrice - StandardCost as PriceDifference, 
        DaysToManufacture / 5.0 as WeeksToManufacture)
    

    I valori aggiuntivi, PriceDifference e WeeksToManufacture, non sono presenti nel database. Possono essere visualizzati solo dopo aver eseguito un calcolo sui valori presenti nel database.

  2. Nel controllo GridView aggiungere i controlli BoundField per le colonne PriceDifference e WeeksToManufacture e rimuovere il controllo BoundField per DaysToManufacture.

    Nell'esempio seguente viene illustrato il markup dichiarativo per i controlli BoundField calcolati.

        <asp:BoundField 
            DataField="PriceDifference" 
            HeaderText="Price Difference" 
            SortExpression="Price Difference" />
        <asp:BoundField 
            DataField="WeeksToManufacture" 
            HeaderText="Weeks To Manufacture" 
            SortExpression="WeeksToManufacture" />
    
  3. Salvare la pagina e premere CTRL+F5 per visualizzare la pagina in un browser.

    Nel controllo GridView vengono visualizzate le colonne per i record correnti e i valori calcolati dalla tabella Product.

Selezione di valori da tabelle correlate

È possibile recuperare i valori da una tabella e i valori da tutte le tabelle correlate con un unico controllo LinqDataSource. Quando per una tabella esiste una relazione di chiave esterna con altre tabelle, Object Relational Designer genera una classe di entità che contiene le proprietà per ogni tabella correlata. Queste proprietà restituiscono un oggetto che rappresenta la tabella correlata. L'oggetto contiene a sua volta le proprietà per tutte le colonne della tabella correlata. È possibile selezionare i valori dalle tabelle correlate accedendo agli oggetti nella classe che rappresentano le tabelle correlate.

Per recuperare i dati dalle tabelle correlate

  1. Impostare la proprietà Select del controllo LinqDataSource su:

    new(Name, 
        Size, 
        UnitMeasure.Name as SizeMeasureName, 
        Weight, 
        UnitMeasure1.Name as WeightMeasureName, 
        ProductSubcategory.Name as SubCategoryName)
    

    Le proprietà SizeMeasureName, WeightMeasureName e SubCategoryName contengono i valori delle tabelle che hanno relazioni di chiave esterna con la tabella Products.

  2. Per restituire solo i prodotti che contengono un'unità di misura relativa al peso e alle dimensioni, impostare la proprietà Where su:

    WeightUnitMeasureCode != null || SizeUnitMeasureCode != null
    

    L'applicazione di un filtro a questi valori illustra il modo in cui vengono gestite le relazioni di chiave esterna dal controllo LinqDataSource. L'operatore || consente di eseguire un'operazione di OR logico. Pertanto verranno restituiti solo i record che contengono un valore assegnato ad almeno una delle chiavi esterne.

    Nell'esempio seguente viene illustrato il markup dichiarativo per il controllo LinqDataSource:

    <asp:LinqDataSource 
      ContextTypeName="AdventureWorksDataContext" 
      TableName="Products" 
      Where="WeightUnitMeasureCode != null || 
             SizeUnitMeasureCode != null"
      Select="new(Name,
                  Size, 
                  UnitMeasure.Name as SizeMeasureName, 
                  Weight, 
                  UnitMeasure1.Name as WeightMeasureName, 
                  ProductSubCategory.Name as SubCategoryName)" 
      ID="LinqDataSource1" 
      >
    </asp:LinqDataSource>
    
  3. Nel controllo GridView aggiungere un controllo BoundField per ciascuna colonna da visualizzare. Queste colonne sono Name, Size, SizeMeasureName, Weight, WeightMeasureName e SubCategoryName.

    Nell'esempio seguente viene illustrato il markup dichiarativo per il controllo GridView:

    <asp:GridView 
      AllowPaging="true" 
      AllowSorting="true" 
      AutoGenerateColumns="false" 
      DataSourceID="LinqDataSource1" 
      ID="GridView1" 
      >
      <Columns>
        <asp:BoundField 
              DataField="Name" 
              HeaderText="Name" 
              SortExpression="Name" />
        <asp:BoundField 
              DataField="Size" 
              HeaderText="Size" 
              SortExpression="Size" />
        <asp:BoundField 
              DataField="SizeMeasureName" 
              HeaderText="Size Unit of Measurement" 
              SortExpression="SizeMeasureName" />
        <asp:BoundField 
              DataField="Weight" 
              HeaderText="Weight" 
              SortExpression="Weight" />
        <asp:BoundField 
              DataField="WeightMeasureName" 
              HeaderText="Weight Unit of Measurement" 
              SortExpression="WeightMeasureName" />
        <asp:BoundField 
              DataField="SubCategoryName" 
              HeaderText="Subcategory Name" 
              SortExpression="SubCategoryName" />
      </Columns>
    </asp:GridView>
    
  4. Salvare la pagina e premere CTRL+F5 per visualizzare la pagina in un browser.

    Nel controllo GridView vengono visualizzati i valori dalle tabelle Product, ProductSubCategory e UnitMeasure. È possibile ordinare e spostarsi tra i record.

Passaggi successivi

In questa procedura dettagliata è stato illustrato come personalizzare le colonne e i record restituiti in una query mediante il controllo LinqDataSource. Al controllo LinqDataSource è possibile aggiungere ulteriori funzionalità per:

Vedere anche

Concetti

Cenni preliminari sul controllo server Web LinqDataSource