Come posso passare un’espressione lambda a un servizio WCF?

Il mio progetto attuale utilizza l’architettura IDesign, quindi tutti i miei livelli sono servizi. Volevo che il mio metodo di lettura nel CRUD del mio livello di accesso alle risorse prendesse un predicato sotto forma di un’espressione lambda e un elenco di oggetti correlati da estrarre. In questo modo il livello di accesso alle risorse sarà molto generico.

[OperationContract] Result ReadObjects(Func predicate, string[] includes); 

Ora sono venuto a scoprire qualcosa che avrebbe dovuto essere ovvio, e cioè che non posso serializzare le espressioni lambda. Ho esaminato l’analisi di una stringa in un’espressione lambda, ma non è il caso.

C’è qualche metodo che posso usare per passare un’espressione lambda a un servizio? C’è un modo migliore per fare ciò che sto cercando di fare?

Forse una query dynamic potrebbe funzionare nella tua situazione?

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Si passerebbe una stringa clausola where al servizio che verrebbe convalidata e convertita in un’espressione

Dobbiamo risolvere questo problema in LINQ-to-Just-About-Everything. Ad esempio, quando si esegue LINQ-to-SQL:

 var results = from c in customers where c.City == "London" select c.Name; 

in qualche modo il contenuto di c=>c.City == "London" e c=>c.Name devono finire sul server SQL in una forma che il server comprende. Chiaramente non possiamo persistere i lambda al server.

Invece ciò che facciamo è trasformare i lambda in alberi di espressione, analizzare gli alberi di espressione in fase di esecuzione, creare una vera e propria stringa di SQL e inviare quella stringa al server per l’elaborazione.

Puoi fare la stessa cosa Crea una lingua di query per il tuo server. Dal lato del cliente, trasforma i lambda in alberi di espressione. Analizzali in fase di runtime, trasforma il risultato in una stringa nel tuo linguaggio di query e quindi invia la query al servizio.

Se sei interessato a come funziona in LINQ, l’architetto LINQ-to-SQL Matt Warren ha scritto una lunga serie di articoli sul blog su come farlo da solo:

http://blogs.msdn.com/b/mattwar/archive/2008/11/18/linq-links.aspx

WCF non offre questo fuori dalla scatola. Dovresti essenzialmente scrivere un serializzatore personalizzato che prendesse espressioni lambda e trasformasse l’albero delle espressioni in una porzione di dati serializzabile.

Ecco come funziona WCF DataServices. Si utilizza lambdas nel proprio codice client, si decompone quelle espressioni lambda in stringhe che passa sul querystring al servizio dati che quindi restituisce la stringa in una lambda che si applica a un IQueryable sul lato server.

Doable, ma per scrivere dovresti scrivere un sacco di codice di serializzazione personalizzato. Inoltre, siamo chiari, queste sarebbero espressioni lamdba , non metodi completi di lambda contenenti codice casuale che potrebbe mai essere eseguito sul lato server.

Io uso questa libreria su CodePlex per serializzare / deserializzare gli alberi di espressione (ma la sua versione precedente), e fa il lavoro.

Ci sono anche altre domande simili qui come questa: Serializzazione e deserializzazione di alberi di espressione in C #

Crea un object di query e passalo ai tuoi servizi.

Vedere se questo aiuta:

http://ruijarimba.wordpress.com/2011/05/09/entity-framework-and-t4-generate-query-objects-on-the-fly-part-1/

Un esempio:

 var search = new AlbumSearch(); search.PriceFrom = 5; search.PriceTo = 10; search.Artist = new ArtistSearch(){ Name = "Metallica" }; search.Genre = new GenreSearch(){ NameContains = "Metal" }; var albuns = from x in repository.All(search.GetExpression()) select x; 

Ho trovato un progetto open source in codeplex è la soluzione di questo problema come sobject

Serializzatore di Expression Tree

Descrizione del progetto una libreria di classi .NET 4.0 e Silverlight 4 che serializza e deserializza le istanze di Expression. Inoltre: un provider LINQ WCF IQueryable e un client Web Http (REST) ​​per Silverlight che fornisce un’API client REST semplificata (ad es. WebChannelFactory di WCF) più semplice da utilizzare rispetto a WebClient.

su questo link

http://expressiontree.codeplex.com/