5 messaggi dal 23 ottobre 2008
Ciao,

questo è il mio primo post (sono un po' emozionato..!).

Ho cercato a lungo esempi o altro ma senza successo...

Il mio problema: tramite un metodo di un WCF service devo restituire al client(silverlight 2) il risultato di una query LINQ che è un tipo anonimo ("var", insomma..).

Non posso fare cose tipo List<Customer> MioMetodo(...) perchè non ritorno una classe "customer" del dbml (è LINQ to SQL) bensì una join su più classi.
Quindi il client non conosce il tipo: ho provato con DataCotractSerializer serializzando il tutto il un MemoryStream e quindi ritornando una stringa, ma quando la deserializzo sul client (faccio la ReadObject(..), quindi deserializzare su un tipo diverso in effetti...) mi da SerializationException.

Insomma: come posso fare a spedire un tipo anonimo? Anche serializzandolo?

Grazie in anticipo per l'aiuto...

PS: ieri al remix a Milano ho chiesto a Brambati il quale mi conferma che coi .NET ria service tutto ciò sarà più semplice... però devo aspettare ancora un po'!! Comunque gran bella giornata!!

Luca

LT
2.190 messaggi dal 04 marzo 2004
Contributi | Blog
FAACPARKING wrote:
Ciao,

questo è il mio primo post (sono un po' emozionato..!).

Ho cercato a lungo esempi o altro ma senza successo...

Il mio problema: tramite un metodo di un WCF service devo restituire al client(silverlight 2) il risultato di una query LINQ che è un tipo anonimo ("var", insomma..).

Non posso fare cose tipo List<Customer> MioMetodo(...) perchè non ritorno una classe "customer" del dbml (è LINQ to SQL) bensì una join su più classi.
Quindi il client non conosce il tipo: ho provato con
DataCotractSerializer serializzando il tutto il un MemoryStream e quindi ritornando una stringa, ma quando la deserializzo sul client (faccio la ReadObject(..), quindi deserializzare su un tipo diverso in effetti...) mi da SerializationException.

Insomma: come posso fare a spedire un tipo anonimo? Anche
serializzandolo?
Ciao, potresti utilizzare oggetti appositi per il trasferimento dati aka Data Transfert Object (DTO)

Grazie in anticipo per l'aiuto...

PS: ieri al remix a Milano ho chiesto a Brambati il quale mi conferma che coi .NET ria service tutto ciò sarà più semplice... però devo aspettare ancora un po'!! Comunque gran bella giornata!!
Eh sì, Ria Service semplificherà un bel po'.. vediamo come evolve il progetto, le basi sono molto buone.

Alessio Leoncini (WinRTItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer
5 messaggi dal 23 ottobre 2008
Ciao,

grazie per la tempestiva risposta!

Non avendo NESSUNA conoscenza sui DTO, mi sono letto questo ...

http://msdn.microsoft.com/en-us/magazine/dd263098.aspx?pr=blog#id0100020

... prolisso esempio di utilizzo dei DTO per un caso "simile" al mio, e sono ancor più sfiduciato!

In realtà nel mio caso sul client ho solo bisogno di fare un binding con un datagrid (in un modo anche abbastanza brutale), che serve solo per visualizzare in forma di tabella i dati presenti in un report (perpetuumsoft.com fornisce il controllo reportViewer per client da cui non puoi estrarre i dati arrivati).

Quindi non mi serve "CRUD" ma solo "R", riguardo ai miei dati. Non so se questo semplifichi le cose, ma vorrei evitare di dover riscrivere le classi sul client per avere un tipo/classe per discriminare quanto arriva dal web service...

ho trovato questo post

http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/fe0036fa-a4f4-4cf0-84b2-0fb6607aaa3e

che mi ha dato qualche speranza, anche se a dire il vero penso non si riferisca a una web app. Esiste una possibilità con reflection??

Grazie...

LT
FAACPARKING wrote:
che mi ha dato qualche speranza, anche se a dire il vero penso non si riferisca a una web app. Esiste una possibilità con reflection??

esiste astoria, aka ADO.NET Data Services
http://tags.aspitalia.com/ADO.NET_Data_Services/
più nello specifico:
http://www.silverlightitalia.com/articoli/silverlight/data-services-sive rlight-2.0.aspx

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
5 messaggi dal 23 ottobre 2008
Ciao,

anzitutto grazie per il prezioso aiuto: ADO.NET Data Services sembra essere proprio la soluzione!

Mi sono fatto un minimo di letture ed esperimenti in merito (oltre ai link suggeriti :)) e... ho un po' di confusione! In particolare riguardo al suffisso "ID".

Mi spiego: mi sembra di aver capito che l'algoritmo funziona cercando una "chiave primaria" il cui nome deve essere uguale a "nome dell'entità" + "ID" oppure solo "ID", se non trova nessun campo con queste caratteristiche restituisce errore, e questo vale per tutte le entità.

Ho fatto un po' di prove su una tabella di datacontext in cui ho

[DataServiceKey("appId")]
public partial class tab_mes_app
{

}

(la dichiarazione che aggiungo per ogni entità per poter usare LinqToSql nel codeBehind del dataService)

e funziona regolarmente (ad esempio con http://localhost:50215/systemwp4DataService.svc/tab_mes_apps(1) la interrogo e restituisce i dati), anche questo non segue quanto detto qui

[urlhttp://aspalliance.com/1849_LINQ_to_SQL_and_ADONET_Data_Services_Working_Together.all[/url]

CITO:
"...
The following algorithm is used to detect whether the fields are key or not. At first the field named "EntityTypeID" is searched among a set of properties ("EntityType" is the name of entity you need). For example, if the entity is named "Customer," the key field will be "CustomerID." If this property is found, it is a key field. If such property is not found, the search of a field with a name "ID" will be started. If this property is found, it is a key field. If such a property is not found, the error will be generated.
..."

Inoltre, qual'è il "key field" in un caso come

[DataServiceKey("mesId", "langId", "appId")]
public partial class tab_me
{

}

In cui non so bene come testare un interrogazione: se uso un valore di mesId = 3, cioè "http://localhost:50215/systemwp4DataService.svc/tab_mes(3)" mi restituisce errore... come si fa a specificare su che campo restituire i dati? E qual'è il campo chiave? Nessuno rispetta le regole descritte sull "ID"...


scusate l'inesperienza... e grazie!


Luca

LT
che errori ricevi di preciso?, inoltre ti consiglio una chiave per entità non di più

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
5 messaggi dal 23 ottobre 2008
Ciao,

dopo svariate prove direi che "ID" come parte del nome del campo chiave non è poi così vincolante: una query per campo chiave, del tipo

http://localhost:50215/systemwp4DataService.svc/tab_mes(1)

funziona normalmente, e anche i filtri come "http://localhost:50215/systemwp4DataService.svc/tab_mes?$filter=mesId eq 2 and appId eq 1".

In questo caso il nome del campo chiave è "mesId" (non "tab_mesId" come dovrebbe essere).

Questo se lo provo per poche entità in un progetto di esempio. Se invece uso tutte le tabelle (una quarantina) e dichiaro nel data service tutte le entità comprese nel dbml e faccio il "view in browser" del servizio mi dice "Errore della richiesta" -> "Il server ha riscontrato un errore durante l'elaborazione della richiesta. Vedere i log dei server per maggiori dettagli."

... ma dove sono i Log??

L

LT
5 messaggi dal 23 ottobre 2008
Ce l'ho fatta!

inserendo prima della dichiarazione della classe "ServiceBehavior(IncludeExceptionDetailInFaults = true)" e impostando UseVerboseErrors = true nell'InitializeService nel browser vengono visualizzate le eccezioni:


  
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]   
public class SystemWP4DataService:DataService<Systemwp4DataClassesDataContext>   
    {   
        // This method is called only once to initialize service-wide policies.   
        public static void InitializeService(IDataServiceConfiguration config)   
        {   
            // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.   
            // Examples:   
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);   
            config.UseVerboseErrors = true;   
            // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);   
        }   
    }



Insomma, alla fine era una delle proprietà di una delle entità del DB: sul DB un campo è "VarChar(1)" e nel dbml automaticamente diventa "char", che come tipo non è gradito ;).

Cambiando la proprietà in "string" tutto funziona!


Grazie a tutti.

LT

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.