Project Description
a .NET 4.0 and Silverlight 4 class library that serializes and deserializes
Expression instances. Also: a WCF IQueryable LINQ Provider and Web Http (REST) client for Silverlight that provides a simplified REST client API (i.e. WCF's WebChannelFactory) that's easier to use than WebClient.
I picked up where Luca and Luke
left off in 2008
on Expression serialization, and rewrote a new Expression Serialization project that's compatible with .NET4.0 and Silverlight 4.
I worked through the bugs that existed not only in the .NET 3.5 code as it were, but also the new bugs in .NET 4.0 and Silverlight 4. Additionally, I took out the code which was DLINQ or Entity Framework -dependent and replaced this
with a more generic code that will work with any data access layer (even ADO.NET classic).
So this is a .NET 4.0 and Silverlight 4 class library that serializes and deserializes Expression instances (from
System.Linq.Expressions). What this enables a developer to do is:
- write LINQ queries in familiar C# syntax on the client side,
- then send them over the wire to a WCF service, and
- then execute the LINQ query on the server-side.
You can just use the straight Expression serialization methods, but the project also has a working implementation of a IQueryProvider
Update: new LINQ Provider project now available:
http://linqprovider.codeplex.com/
This has some basic similarities to the capabilities provided by
WCF Data Services (or WCF RIA services). For example, there's an IQueryProvider (RemoteQueryProvider) that lets you execute LINQ queries against a remote WCF service.
- To execute LINQ queries against the remote WCF IQueryProvider we use the following pattern
of use (in Silverlight):
Task.Factory.StartNew(() =>
{
IQueryable<Customer> queryable = from c in new Query<Customer>()
where c.ID <= 30
&& c.Country == "Spain"
|| c.ContactTitle == "Owner"
select c;
List<Customer> results = queryable.ToList();
int count = queryable.Count();
});
which in my opinion feels more familiar and a little less work than
EntityQuery<Customer> entityQuery =from c in context.GetCustomersQuery()
where c.ID <= 30
&& c.Country == "Spain"
|| c.ContactTitle == "Owner"
select c;
System.ServiceModel.DomainServices.Client.LoadOperation<Customer> loadOp
= context.Load<Customer>(entityQuery, true);
var entities = loadOp.Entities;
loadOp.Completed += (a, b) =>
{
var list = entities.ToList();
_customers = list;
};
that you get with WCF RIA Services. (In .NET 4.0 you can completely leave out the call to (TaskFactory.StartNew).
2 components which I included and updated:
- The Expression Tree serialization API: A general purpose XML serialization of Expression Trees. This works over any expression tree (ConstantExpression, MemberExpression, and yes even LambdaExpression and MethodCallExpression,
and so on). I've worked through most of the bugs I think.
- An IQueryable implementation wrapping the client side of the WCF service: The client-side calling syntax is simplified by providing an IQueryable implementation. My implementation uses a class RemoteProvider that implements
IQueryProvider. When the LINQ query needs to be executed, it serializes the Expression of the query to XML and sends it to the WCF server to be executed.
Other changes:
- Where ExpressionSerializer used reflection and the run-time could be narrowed down to a limited set of possiblities (such as a Expression), I opted to use T4 Text Templates to auto-generate the code instead.
- Any ConstantExpression of non-primitive, non-string Type were just represented as their .ToString(). I rewrote the code so that you can provide some
KnownType(s) and DataContractSerializer will serialize their ConstantExpression values into the serialized Expression.
- A general-purpose WebHttpClient class for calling the WCF service.
- Remote queries are executed against a Web HTTP (REST) WCF service.
Future Plans:
- serialize/deserialize expressions as JSON.
09/14/2011 - update
I just came across the LINQ IQueryable Toolkit today. I haven't looked at the source yet, but I would encourage you to check out their project also.