Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002

    [Vb.net] Entity framework e tipo anonimo

    Io vorrei fare una query tramite join con EF, quando però metto in relazione le tabelle devo creare un oggetto anonimo mettendoci i valori delle tue tabelle che mi interessano ?

    E se devo passare questo oggetto anonimo ad una routine come lo devo dichiarare ?

    Es.

    codice:
    var query = from p in B.Products
    join c in B.Categories on p.CategoryID equals c.CategoryID
    orderby c.CategoryName,p.ProductName
    select new
    {
    c.CategoryName ,
    p.ProductName,
    p.ReorderLevel
    };
    Query è un tipo anonimo , ma se devo passarlo poi ad una function, all'interno della function come la dichiaro ?

  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536
    Ciao,
    direi di chiarire il linguaggio che usi, sul titolo dice vb.net, ma il codice in esempio è c#.

    per c# ti direi di usare dynamic o List<dynamic>

  3. #3
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536
    Ok, visto che mi hai risposto in altri forum, la richiesta dovrebbe essere in vb.net.

    Purtroppo in vb.net non esiste un equivalente di dynamic in c#, quindi bisogna cercare di arrangiarsi un pò...
    dovresti farti restituire una lista di object :

    codice:
    Module Module1
    
        Sub Main()
            Dim query = Enumerable.Range(0, 10).[Select](Function(s) New With {Key .Proprieta = s}).OfType(Of Object).ToList()
            test(query)
        End Sub
    
        Sub test(ByVal parameter As List(Of Object))
            For Each para In parameter
                Console.WriteLine(para)
                Console.WriteLine(para.Proprieta)
            Next
        End Sub
    
    End Module
    sopra non faccio altro che creare una lista di oggetti "dinamici" che hanno una proprietà chiamata "Proprieta" ed imposto come valore il numero progressivo da 0 a 9, poi faccio un cast degli elementi al tipo Object, quindi li passo ad una sub che itera la lista e scrive a video il contenuto della lista (anche richiamando "Proprieta").

    quindi direi che dovresti fare una cosa del genere.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    Non puoi creare l'oggetto già dentro la query linq e fartelo restituire in modo corretto? Non avresti cosi problemi nel passarlo ai metodi essendo un normale oggetto.

  5. #5
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Ecco un esempio e che con il suggerimento che mi hai dato non funziona.

    codice:
    Dim aj = (From c In db.tabella1 Join d In db.tabella2 On c.Barcode Equals d.barcode Select c.Barcode, c.CodiceProtocollo, d.Data_consegna).OfType(Of Object).ToList

    codice:
    Private Sub prova(ByVal parameter As List(Of Object))
    		For Each para In parameter
    			Console.WriteLine(para)
    			Console.WriteLine(para.ToString)
    		Next
    	End Sub
    Non mi legge le proprietà.

    Questo perchè uso una Join altrimenti mi facevo ritornare l'oggetto tipizzato e non avrei avuto problemi.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    Intedevo tipizzarlo direttamente nella linq così (ho scritto il codice a volo non so se è correttissimo):

    Definisco l'oggetto Info

    codice:
    Public Class Info
    
      Public Property Barcode As String 
      Public Property CodiceProtocollo As String  
      Public Property Data As DateTime
    
    End Class
    A quel punto nella linq mi faccio ritornare l'oggetto tipizzato:

    codice:
    Dim objInfo =
      From c In db.tabella1 Join d In db.tabella2 On c.Barcode Equals d.barcode 
      Select New Info With 
    { 
                             
      .Barcode  = c.Barcode,
      .CodiceProtocollo= c.CodiceProtocollo,
      .Data = d.Data
     }
    Avendo l'oggetto tipizzato non hai problemi a passarlo a metodi

  7. #7
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    A ok perfetto cosi lo avevo fatto anche io.

    Solo che volevo sapere se era possibile farlo in altro modo senza appoggiarsi ad una classe.

  8. #8
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536
    Originariamente inviato da cassano
    Ecco un esempio e che con il suggerimento che mi hai dato non funziona.

    codice:
    Dim aj = (From c In db.tabella1 Join d In db.tabella2 On c.Barcode Equals d.barcode Select c.Barcode, c.CodiceProtocollo, d.Data_consegna).OfType(Of Object).ToList

    codice:
    Private Sub prova(ByVal parameter As List(Of Object))
    		For Each para In parameter
    			Console.WriteLine(para)
    			Console.WriteLine(para.ToString)
    		Next
    	End Sub
    Non mi legge le proprietà.

    Questo perchè uso una Join altrimenti mi facevo ritornare l'oggetto tipizzato e non avrei avuto problemi.
    devi aggiungere il New With {Key .Proprieta = *} nel select

    codice:
    Dim aj = (From c In db.tabella1 Join d In db.tabella2 On c.Barcode Equals d.barcode Select New With {Key .Barcode= c.Barcode, Key .CodiceProtocollo=c.CodiceProtocollo, Key .Data_consegna=d.Data_consegna}).OfType(Of Object).ToList
    codice:
    Private Sub prova(ByVal parameter As List(Of Object))
    		For Each para In parameter
    			Console.WriteLine(para)
    			Console.WriteLine(para.Barcode)
    		Next
    	End Sub
    in VB non ho molta manualità e ho scritto il testo senza provare, ma dovrebbe essere corretto.

    in sostanza devi creare il tipo con le proprietà che leggerai, un qualcosa tipo :
    codice:
    New With {Key .Barcode= c.Barcode, Key .CodiceProtocollo=c.CodiceProtocollo, Key .Data_consegna=d.Data_consegna}

  9. #9
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Scusa dal mio al tuo cambia solo la parola chiave Key , possibile che è quello ?

    Alla fine io scelgo i campi da selezionare senza fare New, ma penso sia lo stesso visto che crea sempre un nuovo oggetto di tipo anonimo.

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    leggendo su http://msdn.microsoft.com/en-us/library/bb384767.aspx vengono spiegati i tipi anonimi...leggendo sotto c'è scritto:

    "For example, an anonymous type cannot be used to define a method signature, to declare another variable or field, or in any type declaration. As a result, anonymous types are not appropriate when you have to share information across methods."

    Sembra quindi che non possono essere passati in nessun modo.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.