2

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.

3 Answers 3

2

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

Sign up to request clarification or add additional context in comments.

Comments

1

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.

Comments

0

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)

1 Comment

Oh d*mn... Question was - if it's possible to do this programmatically. :/

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.