Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110

    [VB.Net] - Creare dinamicamente query LINQ e EF6

    Ciao a tutti!
    Vado dritta al punto così non vi confondo le idee!

    Questa è un tipo di funzione che sono solita scrivere per creare una stringa di SELECT coi dataset in modo dinamico:

    codice:
     Public Function ottieniID_Record(ByVal miaDT As miaDataTable, ByVal strVal As String, ByVal nomeSrcField As String) As Integer
            Dim mioDato As mioDS.miaDataTable = miaDT.Select(nomeSrcField & "='" & strVal & "'")(0)
            If mioDato Is Nothing Then
                Return 0
            Else
                Return mioDato.id_Dato
            End If
        End Function
    Non è tanto importante cosa fa la funzione (eseguire una SELECT in base al critterio di ricerca dinamico) ma il fatto che possa passare come stringa il critterio stesso (nomeSrcField)...

    Cioè se ho la tabella "NOMI" che ha 3 colonne (NOMI/COGNOMI/SESSO) e voglio passare alla funzione che deve selezionare solo chi è SESSO=FEMMINA valorizzo nomeSrcField="SESSO" e strVal="FEMMINA".

    Non so se sono stata chiara...

    Con EF6 e LINQ non riesco a fare una cosa del genere perchè non riesco a passare la variabile (dacchè non posso sotto forma di stringa)...esiste un "TIPO" che posso passare e valorizzare in qualche modo per poter ottenere una funzione analoga?

    E' difficile da spiegare se non sono stata chiara ditemelo che riprovo a spiegarmi!

    Grazie a tutti come sempre!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2011
    residenza
    Arezzo
    Messaggi
    194
    Puoi farlo con i valori optional settati a nothing nella funzione, questo ti permetterà di costruire una query dinamica anche per più parametri, qualcosa di questo tipo:

    codice:
    Public Function ottieniID_Record_conLINQdinamico(Optional ByVal nome as string = Nothing, Optional ByVal cognome as string = Nothing, Optional ByVal sesso as string = Nothing) as List(of ClasseEntity)
        dim entities = dbContext.ClasseEntityDBSet 'prendi tutto il dbset
    
        If Not String.IsNullOrEmpty(nome) Then
            entities = entities.Where(.........)
        End If
    
        If Not String.IsNullOrEmpty(cognome) Then
            entities = entities.Where(.........)
        End If
    
        If Not String.IsNullOrEmpty(sesso) Then
            entities = entities.Where(.........)
        End If
    
        Return entities.ToList()
    End Function
    
    Riccardo Sadocchi
    Microsoft MCP C#

  3. #3
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110
    Quote Originariamente inviata da rikyeko Visualizza il messaggio
    Puoi farlo con i valori optional settati a nothing nella funzione, questo ti permetterà di costruire una query dinamica anche per più parametri, qualcosa di questo tipo:

    codice:
    Public Function ottieniID_Record_conLINQdinamico(Optional ByVal nome as string = Nothing, Optional ByVal cognome as string = Nothing, Optional ByVal sesso as string = Nothing) as List(of ClasseEntity)
        dim entities = dbContext.ClasseEntityDBSet 'prendi tutto il dbset
    
        If Not String.IsNullOrEmpty(nome) Then
            entities = entities.Where(.........)
        End If
    
        If Not String.IsNullOrEmpty(cognome) Then
            entities = entities.Where(.........)
        End If
    
        If Not String.IsNullOrEmpty(sesso) Then
            entities = entities.Where(.........)
        End If
    
        Return entities.ToList()
    End Function
    

    Ma così non è molto dinamica...dovrei fare una funzione con tutti i campi come variabile di funziona tabella per tabella o sbaglio?
    Io vorrei fare una cosa dove passo 3 dati (tabella/entità, colonna criterio, valore criterio) come facevo prima! Se no tanto vale scrivere la select in LINQ ogni volta e via

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2011
    residenza
    Arezzo
    Messaggi
    194
    Per fare questo devi usare la Reflection, ma secondo me è una complicazione eccessiva, secondo me ti conviene implementare qualcosa del genere per le ricerche 'standard' e poi usare query LINQ specifiche 'al momento' quando ti servono.

    Una soluzione più complessa (ma secondo me migliore, in particolare in ottica di riusabilità del codice) è quella di utilizzare un metodo 'generico' che accetta delle NSpecifications ( https://github.com/jnicolau/NSpecifications questo è C#, ma tanto per darti un'idea) oppure che accetta una Func specifica, questo ti permetterebbe di avere centralizzata la logica di interazione con il db, ma con la possibilità di modificare i parametri di ricerca in base alle esigenze.
    In genere questo tipo di soluzioni si utilizzano in contesti DDD (Domain Driven Design) con le Dependency Injection delle interfacce relativa a services e repositories
    Riccardo Sadocchi
    Microsoft MCP C#

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 © 2024 vBulletin Solutions, Inc. All rights reserved.