6 messaggi dal 21 settembre 2010
public class person
codice as string
numdoc as string
totale1 as double
totale2 as double
id as integer
end class

si puo' fare con LINQ Una selezione dei record che con un gruppo
dato da codice+numdoc e la differenza tra totale1-totale2 (del gruppo)=0
mi restituisca tutti record della classe quindi
codice
numdoc
totale1
totale2
id
spero di essere stato chiaro grazie
Modificato da serrainoma il 24 gennaio 2012 10.06 -

SERMAR
5.390 messaggi dal 09 febbraio 2002
Contributi
ok, proviamo a costruire la query LINQ poco per volta. Innanzitutto ti occorre raggruppare tutti gli elementi della lista per codice e numdoc. Quindi usa la clausola Group By:
Dim query = From elemento In lista
            Group elemento By elemento.numdoc, elemento.codice


Poi bisogna capire se gli elementi in ciascun gruppo soddisfano la condizione che totale1-totale2 dia 0 (<-- questa non sono sicuro di averla intepretata correttamente però).
Uso la particella "Into" per poter continuare la query e fare una Where
Dim query = From elemento In lista
            Group elemento By elemento.numdoc, elemento.codice Into Group
            Where Group.Sum(Function(el) el.totale1 - el.totale2) = 0


Infine seleziono tutti gli elementi dai gruppi rispondenti al criterio. Questa è la query finale, restituisce un IEnumerable di Person.
Dim query = From elemento In lista
            Group elemento By elemento.numdoc, elemento.codice Into Group
            Where Group.Sum(Function(el) el.totale1 - el.totale2) = 0
            From elemento In Group
            Select elemento
Se invece volessi mantenere i risultati raggruppati, potrei semplicemente selezionare il gruppo.
Dim query = From elemento In lista
            Group elemento By elemento.numdoc, elemento.codice Into Group
            Where Group.Sum(Function(el) el.totale1 - el.totale2) = 0
            Select Group


ciao
Modificato da BrightSoul il 24 gennaio 2012 21.35 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
6 messaggi dal 21 settembre 2010
ti ringrazio per la risposa questa e' la mia querry

Dim query = From elemento In Entita.WPFSCA
Group elemento By elemento.numdoc, elemento.codice, elemento.datadoc Into Group
Where Group.Sum(Function(el) el.importopag - el.importosca) <> 0
From elemento In Group
Select elemento

ma la differenza tra el.importopag-el.importosca non produce nessun risultato mentre in realta' ho due record uno con importopag=100 e l'altro con importosca=50
chiaramente i due record hanno numdoc e codice uguali
Modificato da serrainoma il 25 gennaio 2012 18.03 -

SERMAR
5.390 messaggi dal 09 febbraio 2002
Contributi
ciao,
lavora con un set di dati più piccolo, fintanto che stai testando la query. Cioè, non attingere direttamente da Entita.WPFSCA, ma creati una lista di person con pochissimi elementi.

Quando ho scritto la query nel post precedente non ero sicuro di aver ben compreso il criterio con cui vuoi estrarre i dati, quindi può darsi che la query non stia funzionando a causa di questo malinteso.


chiaramente i due record hanno numdoc e codice uguali
ok, anche datadoc è uguale? Vedo che nel raggruppamento hai inserito anche quel campo.


ho due record uno con importopag=100 e l'altro con importosca=50

ok, due record... il primo ha importopag=100, mentre importosca quanto vale? Il secondo ha importosca=50, mentre importopag?
Quella clausola Where che ho scritto ragiona così: per ogni record del gruppo, faccio la differenza tra importopag e importo sca. Poi sommo tutte queste differenze e se il risultato è zero, restituisco tutti i record del gruppo.
Se il tuo scopo è invece quello di estrarre solo alcuni records da ogni gruppo, allora questa query non funziona. Qui ogni gruppo di record viene restituito nella sua interezza o per niente.

Comunque, fai un esempio popolando a mano una lista, così hai pochi record e ci puoi ragionare meglio:

Dim lista As New List(Of person)
lista.Add(New person() With {.id = 1, .codice = "A", .numdoc = 1, .datadoc = DateTime.Today, .importopag = 100, .importosca = 0})
lista.Add(New person() With {.id = 2, .codice = "A", .numdoc = 1, .datadoc = DateTime.Today, .importopag = 0, .importosca = 50})
La query, applicata su questa lista, restituirà entrambi i risultati.

Se aggiungo un terzo elemento così, facente parte dello stesso gruppo:
lista.Add(New person() With {.id = 3, .codice = "A", .numdoc = 1, .datadoc = DateTime.Today, .importopag = 50, .importosca = 100})
La query non restituirà più nessun risultato perché la somma di tutti gli importopag del gruppo meno la somma di tutti gli importosca darà come risultato 0, valore che è stato filtrato dalla Where.

ciao
Modificato da BrightSoul il 25 gennaio 2012 20.44 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
6 messaggi dal 21 settembre 2010
GRAZIE PER LA RISPOSTA LA TUA QUERRY FUNZIONA BENE
IL MIO PROBLEMA HO SCOPERTO CHE SE UN CAMPO CONTIENE UN VALORE NULL
LA QUERRY NON MI DA NESSUN RISULTATO A PRESCINDERE
QUINDI SE impotopag o importosca contiene un valore NULL la Querry non funziona
Visto che se stato cosi' cortese come posso IN LINQ usare la Clausula IN
DI SQL SERVER es.
select * from artmag where maga in ['1','A',FI' ]"

Ancora Grazie
Modificato da serrainoma il 26 gennaio 2012 15.46 -

SERMAR
5.390 messaggi dal 09 febbraio 2002
Contributi
ciao,

serrainoma ha scritto:

SE impotopag o importosca contiene un valore NULL la Querry non funziona


già... ha senso perché un valore numerico + NULL dà come risultato NULL e la condizione NULL<>0 che hai nella Where, in quel caso restituisce sempre false.

Dato che le due colonne possono contenere nei valori NULL, immagino che nella tua classe person le proprietà importopag e importosc siano di tipo Nullable.

Public Property importopag As Nullable(Of Double)
Public Property importosca As Nullable(Of Double)
Se questo è il caso, potresti modificare leggermente la query in modo che i valori NULL vengano rimpiazzati da un valore di default numerico che non comprometta la buona riuscita della query. Qui ad esempio, grazie ad If, indico che voglio usare lo zero se il valore della proprietà dovesse essere NULL.

...
Where Group.Sum(Function(el) If(el.importopag, 0) - If(el.importosca, 0)) <> 0
...


serrainoma ha scritto:

come posso IN LINQ usare la Clausula IN DI SQL SERVER

Prima definisci una variabile array di stringhe in cui inserisci i tre valori "1", "A" e "FI". Poi, nella query, usi il suo extension method .Contains per verificare che il valore del campo sia tra quelli. Ecco un esempio:
Dim valori() As String = {"1", "A", "FI"}
Dim query = From elemento In Entita.artmag
            Where valori.Contains(elemento.maga)
            Select elemento
Il LINQ provider tradurrà quel .Contains con un IN nella query SQL.

ciao
Modificato da BrightSoul il 26 gennaio 2012 21.23 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
6 messaggi dal 21 settembre 2010
sempre gentile e preciso nelle tue spiegazioni ho un'altro quesito da porti
si puo' in entity framework con la libreria System.Linq.Dynamic
creare delle querry dinamiche se si puo puoi farmi un esempio

Es.
ti riporto un test che ho fatto ma mi da un errore

Private Function RetQuerryWPFSCANew() As System.Data.Objects.ObjectQuery(Of WpfScadenze.WPFSCA)
Try
Dim Filtro As String = ""
If XAMCODICE.Text <> "" Then
Filtro = ("p.codice=" & XAMCODICE.text)
End If

Dim WPFSCAQuery As System.Data.Objects.ObjectQuery(Of WpfScadenze.WPFSCA) = From p In Entita.WPFSCA Order By p.codice, p.datadoc, p.numdoc, p.id
Where Filtro
Return WPFSCAQuery
Catch ex As Exception
MessageBox.Show("errore " & ex.ToString, "Test Querry")
Return Nothing
End Try

End Function
Modificato da serrainoma il 28 gennaio 2012 08.32 -

SERMAR
5.390 messaggi dal 09 febbraio 2002
Contributi
ciao,

serrainoma ha scritto:

si puo' in entity framework con la libreria System.Linq.Dynamic
creare delle querry dinamiche se si puo puoi farmi un esempio

sì, certo, usando l'extension method .Where. Qui trovi un esempio e il link per scaricare la documentazione. Leggi il paragrafo "Simple Dynamic Query Library Example"
http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Nel tuo caso:
Dim query = Entita.WPFSCA.Where("p.codice=@0", XAMCODICE.Text)


serrainoma ha scritto:
...
Where Filtro
...
Il problema qui è che la variabile stringa "Filtro" non può essere utilizzata direttamente in una query LINQ. Bisogna che prima sia parsata in espressione, e poi venga compilata affinché la si possa eseguire. Tipo così, ma non l'ho testato:
Dim funzione as Func(Of person, Boolean) = DynamicExpression.ParseLambda(Of person, Boolean)("codice=@0", XAMCODICE.Text).Compile()

'ora posso usare la funzione nella clausola Where di una query LINQ
Dim query = From p In Entita.WPFSCA
            Where funzione(p)
            Select p




Ad ogni modo, chiediti se hai effettivamente bisogno di Dynamic Linq. Se devi realizzare un caso simile a quello che hai postato, puoi realizzarlo anche facendone a meno, grazie ad un mix di query LINQ ed extension methods.

'prima definisco la mia query linq
Dim query = From p In Entita.WPFSCA
            Select p.codice, p.datadoc, p.numdoc, p.id
            Order By 

'Poi, se XAMCODICE è stato valorizzato, lo uso per aggiungere un filtro alla query
'mediate l'extension method .Where
If XAMCODICE.Text <> "" Then
Dim valore As String = XAMCODICE.Text
query = query.Where(Function(p) p.codice = valore)
End If

'infine eseguo la query...


serrainoma ha scritto:

sempre gentile


grazie!

ciao :)
Modificato da BrightSoul il 28 gennaio 2012 14.49 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC