2 messaggi dal 15 febbraio 2008
Ciao,

sto cercando di capire come posso passare il risultato di una query linq in EF dal layer logico al front end.

Riporto di seguito un esempio:

LAYER LOGICO:

public List<Examination> GetExaminations(string startDate, string endDate)
{

using (IsoMiDevEntities context = new IsoMiDevEntities())
{
DateTime dtStartDate;
DateTime dtEndDate;

IQueryable<Examination> examinations = from e in context.Examination select e;

// startDate filter
if (DateUtils.IsDate(startDate))
{
dtStartDate = Convert.ToDateTime(startDate);
examinations = examinations.Where(e => e.Exa_Date >= dtStartDate);
}
// endDate filter
if (DateUtils.IsDate(startDate))
{
dtEndDate = Convert.ToDateTime(startDate);
examinations = examinations.Where(e => e.Exa_Date <= dtEndDate);
}


//return
examinations = from e in examinations
orderby e.Exa_Date, e.Exa_HourStart descending
select e;

return examinations.ToList();
}
}


FRONT-END LAYER:

Dim exaProv As ExaminationDataProvider = New ExaminationDataProvider()
Dim ds As List(Of Examination) = exaProv.GetExaminations(Me.txtStartDate.Text, Me.txtEndDate.Text)
Me.GwExaminationList.DataSource = ds
Me.GwExaminationList.DataBind()


in questo esempio faccio il bind di una grid usando l'oggetto List di tipo Examination per passare i dati da un livello all'altro mantenendo la persistenza.

Adesso ho bisogno di fare la stessa cosa però questa volta ho bisogno di visualizzare nella grid dati appartenenti a entity diverse, quindi avrei bisogno di un oggetto List generico (non tipizzato). Io l'ho immaginato un po' come se fosse un datatable, che possa poi direttamente bindare alla grid.

Dato che ho appena inziato ad usare EF e linq vorrei avere qualche feedback in merito (anche in generale se il metodo usato è corretto o se c'è un metodo migliore).

Grazie
Mauro
Modificato da sickpres il 24 ottobre 2010 21.02 -
184 messaggi dal 22 giugno 2008
se ho capito bene... il mio consiglio è quello di far implementare alle tue classi all'interno del "Business logic layer" un interfaccia o farle ereditare tutte da una stessa classe base (cosa tra l'altro utilissima per eliminare molte azioni ridondanti). A quel punto ti basta riempire una lista con parametro generic tipo List<MyInterface> o List<MyBaseClass>.. o piu semplicemente dichiari una List<Object> e magari ti vai a leggere i metadati di ogni oggeto della lista con le reflection..

PS. List<> equivale a List(of )... scusa... l'abitudine....
2 messaggi dal 15 febbraio 2008
Ciao,

grazie per l'attenzione... solo che non ho capito bene cosa intendi... non è che saresti così gentile da farmi un piccolo esempio (con gli esempi capisco al volo!!).

Ti ringrazio di nuovo
Mauro
184 messaggi dal 22 giugno 2008
Ad esempio

Dim exaProv As ExaminationDataProvider = New ExaminationDataProvider()
Dim ds As List(Of Object) = exaProv.GetExaminations(Me.txtStartDate.Text, Me.txtEndDate.Text)
Me.GwExaminationList.DataSource = ds
Me.GwExaminationList.DataBind()


così gia è sufficente se GwExaminationList genera in automatico i campi ma visto che object infondo non ti dice nulla potresti aver bisogno di andarti a leggere i campi negli oggetti della lista uno x uno.




''Import System.Reflection

Dim exaProv As ExaminationDataProvider = New ExaminationDataProvider()
Dim ds As List(Of Object) = exaProv.GetExaminations(Me.txtStartDate.Text, Me.txtEndDate.Text)

'' Ricavo tutte le info sule proprietà a runtime
Dim prop as List(of ProperyInfo) = ds.first().GetType().GetProperties()

ForEach Obj In ds
ForEach item in prop

Dim ValoreProprietà as object = item.GetValue(Obj, null)

Next
Next



in questo modo hai la possibilità di effettuare una lettura pedissequa degli oggetti all'interno della tua lista (di qualunque tipo essi siano xke tanto tutti ereditano da object). Ed hai la lista piu generica possibile!
Modificato da deckman il 26 ottobre 2010 10.03 -

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.