none
Quert LINQ RRS feed

  • Domanda

  • Ciao,

    ho una nuova domanda:

    nella mia applicazione devo gestire un database, e voglio creare una maschere per le ricerche.

    Come faccio a fare una query LINQ da associare a varie toolbox e vari botton?


    Pier!
    lunedì 28 giugno 2010 19:48

Risposte

  • Ciao,

    si e possibili, se hai gia' eseguito la procedura che ti o indicato, puoi eliminare il toolstrip

    che ti a creato la query SQL, e inserire un button e texbox nominati come vuoi, devi solo

    sostituire il nome del textbox abbinato alla query esistente e tutto il codice creato, lo metti

    sotto l'evento click de tuo nuovi button, l'importante e che tu abbia gia' scritto il codice sql

    per il tableadapter.

    Ciao fai sapere.

    • Contrassegnato come risposta Piero87 martedì 29 giugno 2010 09:49
    martedì 29 giugno 2010 08:33

Tutte le risposte

  • Ciao,

    ti lasci questo esempio pero' in C# legge le informazioni da una tabella Customers ed inserisce in un RichTextBox tutte le occorrenze trovate.

    Se ti torna utile bisognera' solamente adattarlo al linguaggio VB.NET.

    using System;
    using System.Data;
    using System.Linq;
    using System.Data.Linq;
    using System.Data.Linq.Mapping;
    using System.Windows.Forms;
    
    namespace Linq_To_Sql
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        [Table(Name = "Customers")] public class Customer
        {
          [Column] public string CustomerID;
          [Column] public string CompanyName;
          [Column] public string City;
          [Column] public string State;
          [Column] public string Country;
        }
    
        private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
          this.Validate();
          this.customersBindingSource.EndEdit();
          this.tableAdapterManager.UpdateAll(this.databaseDataSet);
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          // TODO: questa riga di codice carica i dati nella tabella 'databaseDataSet.Customers'. È possibile spostarla o rimuoverla se necessario.
          this.customersTableAdapter.Fill(this.databaseDataSet.Customers);
        }
    
        private void BtnCrescente_Click(object sender, EventArgs e)
        {
          DataContext db = new DataContext(Linq_To_Sql.Properties.Settings.Default.DatabaseConnectionString);
          Table<Customer> Customers = db.GetTable<Customer>();
    
          var Query = from c in Customers
                orderby c.CustomerID ascending
                select new { c.CustomerID, c.CompanyName, c.City ,c.State,c.Country};
    
          RicercaRichTextBox.Clear();
    
          foreach (var row in Query)
          {
            if (RicercaRichTextBox.Text == " ")
            {
              RicercaRichTextBox.Text = row.CustomerID + '\t' + row.CompanyName + '\t' + row.City + '\t' + row.State + '\t' + row.Country;
            }
    
            if (RicercaRichTextBox.Text != " ")
            {
              RicercaRichTextBox.Text = RicercaRichTextBox.Text + row.CustomerID + '\t' + row.CompanyName + '\t' + row.City + '\t' + row.State + '\t' + row.Country + '\n';
            }
          }
        }
    
        private void button2_Click(object sender, EventArgs e)
        {
          DataContext db = new DataContext(Linq_To_Sql.Properties.Settings.Default.DatabaseConnectionString);
          Table<Customer> Customers = db.GetTable<Customer>();
    
          var Query = from c in Customers
                orderby c.CustomerID descending
                select new { c.CustomerID, c.CompanyName, c.City, c.State, c.Country };
    
          RicercaRichTextBox.Clear();
    
          foreach (var row in Query)
          {
            if (RicercaRichTextBox.Text == " ")
            {
              RicercaRichTextBox.Text = row.CustomerID + '\t' + row.CompanyName + '\t' + row.City + '\t' + row.State + '\t' + row.Country;
            }
    
            if (RicercaRichTextBox.Text != " ")
            {
              RicercaRichTextBox.Text = RicercaRichTextBox.Text + row.CustomerID + '\t' + row.CompanyName + '\t' + row.City + '\t' + row.State + '\t' + row.Country + '\n';
            }
          }
        }
    
        private void NomeClienteLinkLabel_Click(object sender, EventArgs e)
        {
          DataContext db = new DataContext(Linq_To_Sql.Properties.Settings.Default.DatabaseConnectionString);
          Table<Customer> Customers = db.GetTable<Customer>();
    
          var Query = from c in Customers
                where c.CustomerID == NomeClienteTextBox.Text
                select new { c.CustomerID,c.CompanyName,c.City,c.State,c.Country };
    
          RicercaRichTextBox.Clear();
    
          foreach (var row in Query)
          {
            if (RicercaRichTextBox.Text == " ")
            {
              RicercaRichTextBox.Text = "NOME" + '\t' + row.CustomerID + '\n' +
                           "COMPAGNIA" + '\t' + row.CompanyName + '\n' +
                           "CITTA'" + '\t' + row.City + '\n' +
                           "STATO" + '\t' + row.State + '\n' +
                           "PAESE" + '\t' + row.Country ;
            }
    
            if (RicercaRichTextBox.Text != " ")
            {
              RicercaRichTextBox.Text = 
                           RicercaRichTextBox.Text + '\n' + string.Empty + '\n' +
                           "NOME" + '\t' + row.CustomerID + '\n' +
                           "COMPAGNIA" + '\t' + row.CompanyName + '\n' +
                           "CITTA'" + '\t' + row.City + '\n' +
                           "STATO" + '\t' + row.State + '\n' +
                           "PAESE" + '\t' + row.Country;
            }
          }
        }
    
        private void NomeCompagniaLinkLabel_Click(object sender, EventArgs e)
        {
          DataContext db = new DataContext(Linq_To_Sql.Properties.Settings.Default.DatabaseConnectionString);
          Table<Customer> Customers = db.GetTable<Customer>();
    
          var Query = from c in Customers
                where c.CompanyName == NomeCompagniaTextBox.Text
                select new { c.CompanyName, c.City, c.State, c.Country };
    
          RicercaRichTextBox.Clear();
    
          foreach (var row in Query)
          {
            if (RicercaRichTextBox.Text == " ")
            {
              RicercaRichTextBox.Text = 
                           "COMPAGNIA" + '\t' + row.CompanyName + '\n' +
                           "CITTA'" + '\t' + row.City + '\n' +
                           "STATO" + '\t' + row.State + '\n' +
                           "PAESE" + '\t' + row.Country;
            }
    
            if (RicercaRichTextBox.Text != " ")
            {
              RicercaRichTextBox.Text =
                           RicercaRichTextBox.Text + '\n' + string.Empty + '\n' +
                           "COMPAGNIA" + '\t' + row.CompanyName + '\n' +
                           "CITTA'" + '\t' + row.City + '\n' +
                           "STATO" + '\t' + row.State + '\n' +
                           "PAESE" + '\t' + row.Country;
            }
          }
        }

    Puoi anche assegare un valore dei dati a dei controlli differenti, questo esempio carica tutti i dati in un RichTextBox.

    Ciao

    lunedì 28 giugno 2010 20:09
  • Scusami, sono stato poco chiaro.

    tutto il codice che tu gentilmente mi hai caricato mi crea solo confusione. Purtroppo non mastico molto bene, spero solo per ora, il codice. La mia domanda era molto più banale: volevo capire quale logica muove le query LINQ. Per poi riuscire ad elaborarla da solo.

    Io già ho un form con queste caratteristiche, come vedi già ho caricato un database..

    Public Class Form_Ricerca
    
      Private Sub Tabella_DocumentoBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Me.Validate()
        Me.Tabella_DocumentoBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.Archivio_2011DataSet)
    
      End Sub
    
      Private Sub Form_Ricerca_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: questa riga di codice carica i dati nella tabella 'Archivio_2011DataSet.Tabella_Documento'. È possibile spostarla o rimuoverla se necessario.
        Me.Tabella_DocumentoTableAdapter.Fill(Me.Archivio_2011DataSet.Tabella_Documento)
      End Sub
    End Class

    ho già caricato una tabella del database, infatti l'ho trascinata col drag 'n drop, mi si sono create le etichette e le caselle di testo,

    il mio scopo è quello di farmi una casella di testo e un bottone e filtrare la tabella in base al valore che scriverò di volta in volta nella casella di testo (naturalmente legando la casella di testo a una colonna precisa)

     

    grazie


    Pier!
    lunedì 28 giugno 2010 20:36
  • Ciao,

    se ho ben capito vuoi filtrare i dati della tabella giusto,

    creando poi un datatable contenente tutte le voci trovate.

    Ciao.

    lunedì 28 giugno 2010 20:41
  • Si esatto, mi basta però filtrare i dati, non voglio creare altri database, è un form che tengo solo per "consultazione". inserisco un parametro nella mia textbox, schiaccio button e si applica il filtro  alla tabella in maniera da visualizzare solo le voci contenenti quel dato all'interno di tutta la tabella..

     


    Pier!
    lunedì 28 giugno 2010 20:46
  • LINQ è un estensione di linguaggio che ti consente di eseguire query su collezioni di oggetti dichiarando cosa cerchi e non preoccupandoti di come eseguire la ricerca. Si tratta di una sintassi dichiarativa stile SQL.
    Uno dei "dialetti" di LINQ è LINQ to SQL che ti consente di eseguire query dichiarative su banca dati SQL eseguendole da codice e lasciando al "motore" di LINQ la traduzione il T-SQL.
    In LINQ to SQL disponi di un designer (un file dbml) che permette di mappare una tabella su una classe (ti basta trascinarla sul designer per farla creare).
    Oltre alle classi generate in questo modo, il designer di LINQ 2 SQL crea una classe derivata dalla classe DataContext che devi utilizzare come "gateway" all'indirizzo della banca dati.
    In pratica, supponi di avere una tabella Clienti e che il datacontext si chiami GestioneClienti. La tabella clienti diventa una proprietà (che viene chiamata Clientis) di tipo EntitySet(of Clienti).
    In questo modo, per avere una query che recupera i clienti di nome "Mario" potremmo scrivere:

    dim query = From c in GestioneClienti.Clientis _
              where c.Nome="Mario" _
              select c

    Caratteristica importante di LINQ to SQL è che la query non viene eseguita quando l'esecuzione incontra l'istruzione, ma nel momento in qui sull'oggetto query richiedi qualche proprietà, come ad esempio, count o un for each.

    Attenzione, però, che non tutte le istruzioni VB.NET possono essere convertite in T-SQL e quando non è possibile ti becchi un'eccezione.

    Il DataContext ti permette, inoltre, di eseguire inserimenti, update e cancellazioni ma credo che per ora possa bastare la parte di query. Se hai ulteriori dubbi siamo a disposizione.

    Spero di non essere stato troppo elementare.

    lunedì 28 giugno 2010 20:52
    Moderatore
  • Ciao,

    ok ti lascio questo codice vb , lodevi solo adattare al TableAdapter del tuo DataBase

      Private Sub FillByCompagniaToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FillByCompagniaToolStripButton.Click
        Try
          Me.TabellaClientiTableAdapter.FillByCompagnia(Me.ClientiDataSet.TabellaClienti, COMPAGNIAToolStripTextBox.Text)
        Catch ex As System.Exception
          System.Windows.Forms.MessageBox.Show(ex.Message)
        End Try
    
      End Sub

    Questo esempio filtra tutti i parametri "Compaglia", bisogna adattarlo assegnandogli un campo del Tuo DataBase, e COMPAGNIAToolStripTextBox.Text

    e il TextBox dove immettere il nome da ricercare, in questo esempio c' è Me.TabellaClientiTableAdapter e va sostituito con  Me.Tabella_DocumentoTableAdapter

    e Me.ClientiDataSet.TabellaClienti con Me.Archivio_2011DataSet.Tabella_Documento.

    Provalo e fai sapere.

    Ciao.

    lunedì 28 giugno 2010 20:56
  • Oltre alle classi generate in questo modo, il designer di LINQ 2 SQL crea una classe derivata dalla classe DataContext che devi utilizzare come "gateway" all'indirizzo della banca dati.
    In pratica, supponi di avere una tabella Clienti e che il datacontext si chiami GestioneClienti. La tabella clienti diventa una proprietà (che viene chiamata Clientis) di tipo EntitySet(of Clienti).
    In questo modo, per avere una query che recupera i clienti di nome "Mario" potremmo scrivere:

    dim
     query = From
     c in
     GestioneClienti.Clientis _
         where
     c.Nome="Mario"
     _
         select
     c
    

    Caratteristica importante di LINQ to SQL è che la query non viene eseguita quando l'esecuzione incontra l'istruzione, ma nel momento in qui sull'oggetto query richiedi qualche proprietà, come ad esempio, count o un for each.

    Attenzione, però, che non tutte le istruzioni VB.NET possono essere convertite in T-SQL e quando non è possibile ti becchi un'eccezione.

    Il DataContext ti permette, inoltre, di eseguire inserimenti, update e cancellazioni ma credo che per ora possa bastare la parte di query. Se hai ulteriori dubbi siamo a disposizione.

    Spero di non essere stato troppo elementare.

    Mai abbastanza elementare, mi dispiace crearvi tutti sti problemi, ma mi perdo facilmente. nel tuo esempio "c" cos'è? E la "s" la aggiunge da solo?

    Pier!
    lunedì 28 giugno 2010 21:09
  • Io quasi mi vergogno, è una situazione imbarazzante. Il codice che mi dai non lo capisco. dove devo copiarlo? il bottone che ho creato che fine fa? La textbox che ho creato?


    Pier!
    lunedì 28 giugno 2010 21:18
  • Ciao,

    ti riferisci al codice di MassimoBonanni ho al codice che ti ho postato in precedenza?.

    Ciao.

    lunedì 28 giugno 2010 21:25
  • Scusami, mi riferisco al tuo

    Pier!
    lunedì 28 giugno 2010 21:29
  • Ciao,

    devi crearti una query SQL se non lo hai ancora fatto simile a questa nella TableAdapter del Tuo DataBase ,scegli modifica query in

    progettazione dataset, e successivamente scegli aggiungi query,poi inserisci i nomi dei campi della Tabella

    che vuoi filtrare , in questo caso verra' filtrato cio' che scegli in compagnia.

    SELECT     ID, NOME, COGNOME, COMPAGNIA, INDIRIZZO, CITTA, REGIONE, CODICEPOSTALE, NAZIONE, EMAIL, TELEFONO
    FROM         TabellaClienti
    WHERE     (COMPAGNIA = ?)

    Terminata la query SQL, sempre nel TableAdapter fai aggiungi query e seleziona la query che hai creato ed inseriscila. 

    Successivamente, creati un pulsante dove inserire poi il codice che ti ho postato in precedenza, e una TextBox per passargi cio'

    che voui filtrare.

    Se hai ancora problemi lascia se possibile il codice in modo da poterlo assemblare e aiutarti a completare cio' che intendi fare.

    Ciao.

    lunedì 28 giugno 2010 22:10
  • Ciao,

    una query di questo tipo l'ho già creata, tramite la procedura guidata che tu descrivi. Praticamente mi ritrovo con gran partre del codice che tu dici già scritto e l'unica riga che dovrei aggiungere sarebbe quella con WHERE (Tabella_Documento = ?), dove a dire il vero io usavo un carattere diverso dal ?. Questa dovrebbere essere una query SQL.. giusto o faccio confusione?

    Ma il problema non è questo. Per inserire questa query infatti faccio esattamente come dici te, da TableAdapter la aggiungo e mi si crea una ToolStrip con tutte le caselle di testo e i relativi button.

    La domanda che volevo fare era diversa. Possiedo un manuale in cui leggo che è possibile fare query in un'altro modo, chiamate query LINQ. Volevo tentare questa strada, che ahimè faccio fatica ad intraprendere.

    Se nel mio form creo un button (Button1) e una casalla di testo (TextBox1) slegati da qualsiasi ToolStrip già esistente, tenendo presente che ci sono già visualizzati i campi del mio database perchè inseriti in precedenza. Posso utilizzare la Button1 e TextBox1 per creare un filtro?

    Vorrei postarti una immagine per essere piu chiaro ma non riesco..


    Pier!
    martedì 29 giugno 2010 06:42
  • Ciao,

    si e possibili, se hai gia' eseguito la procedura che ti o indicato, puoi eliminare il toolstrip

    che ti a creato la query SQL, e inserire un button e texbox nominati come vuoi, devi solo

    sostituire il nome del textbox abbinato alla query esistente e tutto il codice creato, lo metti

    sotto l'evento click de tuo nuovi button, l'importante e che tu abbia gia' scritto il codice sql

    per il tableadapter.

    Ciao fai sapere.

    • Contrassegnato come risposta Piero87 martedì 29 giugno 2010 09:49
    martedì 29 giugno 2010 08:33
  • Perfetto, facendo così risco a fare la query dalla mia TextBox e con il mio Button.

    Secondo te, avendo una decina di colonne della tabella da filtrare, mi conviene su continuare su questa strada? Mi sono intestardito con 'sto LINQ che non capisco cosa sia...

    Cosa mi conisgli? Mi creo 10 query ed ogniuna la associo ai controlli che vado a crearmi di volta in volta? Devo ogni volta cancellare la ToolStrip che mi si crea o posso aggiungere la queri in modo diverso?

    Molte grazie.


    Pier!
    martedì 29 giugno 2010 08:59
  • Ciao,

    si ti consiglio di seguire questa strada, e  la trovo in questi casi piu' pratica, in quanto come vedi, questa espressione SQL ti

    restitiusce un metodo e visualizza i campi che a te interessano, comunque linq e un'ottimo linguaggio ed e un'estensione non solo

    di vb.net ma anche diC# ed altri, esistono diversi criteri te ne dico qualcuno Linq to Objects , Linq to SQL, sarebbe cio' che ti serve

    in questo momento per filtrare i dati , l'esempio postato in C# utilizzava Proprio Linq to SQL e restituiva tutti i dati in ordine crescente

    di una tabella, avrei potuto per ognuno di essi mettere una casella di teso ma non era importante, Linq e XML ed altri.

    Se ti interessa un libro che ho trovato molto esaustivo guarda questo link http://www.ibs.it/code/9788861141605/pialorsi-paolo/programmare-microsoft-linq.html

    Ciao, se hai bisogno di aiuto chiedi tranquillamente.

    martedì 29 giugno 2010 09:15
  • Seguirò il tuo consiglio, senza dimenticare di comprendere meglio LINQ, magari attraverso il libro che mi hai indicato. Grazie per questo e anche per tutto il resto.

    Siete stati tutti molto pazienti. E' la seconda discussione che apro, e in poche ore, sono arrivato a risolvere il mio problema. Questo Forum merita una lode per chi, come voi, lo valorizz. Ho avuto altre esperienze in altri forum... il confronto non regge...

    Grazie ancora, spero in futuro (non troppo lontano dai... :)) di poter ricambiare aiutando chi, come me ora, si trova in difficoltà..

     


    Pier!
    martedì 29 giugno 2010 09:56