320 messaggi dal 12 gennaio 2007
Dovrei filtrare con una query linq la seguente base dati parametri di filtro State=true e Attivo=true
su questa base dati:

Public Class Marchi
<Key>
Public Property id As Integer
Public Property Marca As String
Public Property State As Boolean
Public Overridable Property Categorie As ICollection(Of Categorie) = New HashSet(Of Categorie)
End Class
Public Class Categorie
<Key>
Public Property id As Integer
Public Property Categoria As String
Public Property Marchi_id As Integer
Public Property Attivo As Nullable(Of Boolean)
Public Overridable Property Marchi As Marchi
End Class
La query vorrei che mi filtrasse sia i marchi che le categorie.

Ho provato in questo modo,ma non funziona.
Dim marchi = db.Marchi.Where(Function(s) s.State = True And s.Categorie.Any(Function(j) j.Attivo = True))
Modificato da tupen il 14 febbraio 2014 13.01 -

Massimo Sanfelici

Mantova
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Massimo,
Riporta il testo dell'errore, magari ci dà degli indizi. Che tipo di database stai usando?

tupen ha scritto:

La query vorrei che mi filtrasse sia i marchi che le categorie.

Ok, tu stai cercando di ottenere una lista di Marchi o una lista di Categorie?

ciao,
Moreno

Enjoy learning and just keep making
320 messaggi dal 12 gennaio 2007
Ciao,grazie.
Sto usando mssql.
Non mi da un errore,non mi filtra le Categorie.
Le Categorie uguali a false,risultano ancora nella lista.

Massimo Sanfelici

Mantova
11.886 messaggi dal 09 febbraio 2002
Contributi

Le Categorie uguali a false,risultano ancora nella lista.

Già, questo succede perché con Any stai chiedendo di ottenere tutti gli articoli che abbiano almeno una categoria attiva. Nessun filtraggio viene operato sulla collezione di categorie in sé.

Dunque quello che vuoi ottenere, mi sembra di aver capito, è una lista di categorie, e non di marchi.

Magari poi le categorie le raggruppiamo per marchio, se questo ti agevola nel presentare i risultati nella pagina.

Dunque prova con questa query LINQ (non ho verificato che funzioni ma dovrebbe comunque servire a darti un'indicazione).
Dim categorieRaggruppatePerMarchio = From Marchio In db.Marchi
                                     From Categoria In Marchio.Categorie
                                     Where Marchio.State And Categoria.Attivo
                                     Group By Marchio Into Categorie = Group


Il risultato sarà una lista di gruppi. Ciascun elemento della lista possiederà una proprietà Marchio e una proprietà Categorie, che è a sua volta una collezione delle sole categorie attive.

ciao,
Moreno
Modificato da BrightSoul il 17 febbraio 2014 22.52 -

Enjoy learning and just keep making
320 messaggi dal 12 gennaio 2007
Ok.
Ma avrei bisogno che la struttura rimanesse invariata,cioè che mi restituisse una lista di Marchi dove all'interno di ogni Marchio ci fosse la sua lista di Categorie e se possibile non un tipo anonimo.
Ciao.

Massimo Sanfelici

Mantova
1.495 messaggi dal 27 dicembre 2005
BrightSoul ha scritto:

Le Categorie uguali a false,risultano ancora nella lista.

Già, questo succede perché con Any stai chiedendo di ottenere tutti gli articoli che abbiano almeno una categoria attiva. Nessun filtraggio viene operato sulla collezione di categorie in sé.

Dunque quello che vuoi ottenere, mi sembra di aver capito, è una lista di categorie, e non di marchi.

Magari poi le categorie le raggruppiamo per marchio, se questo ti agevola nel presentare i risultati nella pagina.

Dunque prova con questa query LINQ (non ho verificato che funzioni ma dovrebbe comunque servire a darti un'indicazione).
Dim categorieRaggruppatePerMarchio = From Marchio In db.Marchi
                                     From Categoria In Marchio.Categorie
                                     Where Marchio.State And Categoria.Attivo
                                     Group By Marchio Into Categorie = Group


Il risultato sarà una lista di gruppi. Ciascun elemento della lista possiederà una proprietà Marchio e una proprietà Categorie, che è a sua volta una collezione delle sole categorie attive.

ciao,
Moreno
Modificato da BrightSoul il 17 febbraio 2014 22.52 -



invece di questo :
 From Marchio In db.Marchi
From Categoria In Marchio.Categorie


Non è meglio usare .Include ?
320 messaggi dal 12 gennaio 2007
Grazie.
Dim categorieRaggruppatePerMarchio = From Marchio In db.Marchi
From Categoria In Marchio.Categorie
Where Marchio.State And Categoria.Attivo
Group By Marchio Into Categorie = Group
Va bene,restituisce sempre un anonimo,non è possibilie una lista di Marchi.

Non è meglio usare .Include ?

Come?

Ciao,grazie.

Massimo Sanfelici

Mantova
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
Include non ti permette di indicare un'espressione di filtro per caricare selettivamente solo determinate entità correlate. Le carica sempre tutte.

Sembra strano ma una funzionalità che esisteva già 6 anni fa in LinqToSql, rimane ancora sullo stato di "pianificata per un futuro rilascio" in Entity Framework.
https://entityframework.codeplex.com/workitem/47

Di conseguenza non puoi raggiungere il tuo scopo con l'Include. Puoi invece cavartela con l'explicit loading ma questo ti costringe ad inviare n+1 queries al database, il che non è l'ideale per le performance.
http://msdn.microsoft.com/en-us/data/jj574232#explicitFilter

tupen ha scritto:

Va bene,restituisce sempre un anonimo,non è possibilie una lista di Marchi?

Se vuoi seguire la soluzione del post precedente, sì, probabilmente puoi anche ottenere una lista di marchi, purché lo scopo sia solo quello di visualizzare quella lista.
Ipoteticamente potresti provare a farlo così e, se anche funzionasse, comprendi bene che non è una soluzione semplice o elegante.
  • Dopo aver istanziato il contesto, disabilita la creazione di proxy
  • Scrivi la query e ottieni come risultato una collezione di tipi anonimi che congeli con il .ToList()
  • Fai un foreach e da ogni elemento della collezione estrai il marchio e la relativa collezione di categorie, che assegnerai alla sua proprietà Categorie.
  • Aggiungi il marchio così assemblato ad una lista, che poi restituirai come risultato del tuo metodo.


ciao,
Moreno

Enjoy learning and just keep making

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.