views:

1072

answers:

3

Is it possible to somehow programmatically convert a sql query to a linq expression tree? The sql query is supposed to be generated by this linq query, so I'm thinking of it as a poor man's serialization\deserialization of linq queries to t-sql format.

Thank you.

+1  A: 

I don't believe there's anything built into LINQ-to-SQL.

In theory I dare say it would be possible (although it wouldn't guarantee roundtripping, as there are different ways of expressing the same query) - but very hard to do well.

Jon Skeet
A: 

Thing what can possibly help you - LINQPad. I suppose, it can't translate SQL to LINQ query, but it can translate LINQ to SQL.

One option would be to track from SQL generated IL code. For example:

SELECT TOP (50) [t0].[Id], [t0].[tralala]
FROM [pamparam] AS [t0]

Generates:

IL_0001:  ldarg.0     
IL_0002:  call        LINQPad.User.TypedDataContext.get_pamparam
IL_0007:  ldc.i4.s    32 
IL_0009:  call        System.Linq.Queryable.Take
IL_000E:  call        LINQPad.Extensions.Dump

This way it's quite obvious, that LINQ query would look like:

pamparam.Take (50)
Arnis L.
Oh d*mn... Question was - if it's possible to do this programmatically. :/
Arnis L.
+2  A: 

Everything is possible, it just requires a truckload of work. The problem is that you first have to parse the SQL query, and interpret the AST to convert it into a linq expression tree. This isn't trivial, as Linq isn't 1:1 compatible with sql: for example, in linq, aggregates on a groupby are external to the groupby, while in SQL they're internal: they have to be in the same scope as the groupby otherwise they won't work. This kind of info is needed for converting linq queries into SQL queries but also the other way around.

So to store queries, I'd chose a different route, e.g. a specification pattern

Frans Bouma