2009-05-21 6 views
2

Est-il possible de convertir d'une manière ou d'une autre une requête sql en une arborescence d'expression linq? La requête sql est censée être générée par cette requête linq, donc je pense à la sérialisation/désérialisation des requêtes linq au format t-sql par un pauvre.Convertir SQL Query par programmation à l'expression Linq

Merci.

Répondre

2

Tout est possible, il faut juste un camion plein de travail . Le problème est que vous devez d'abord analyser la requête SQL et interpréter l'AST pour la convertir en une arborescence d'expression linq. Ce n'est pas trivial, car Linq n'est pas compatible 1: 1 avec sql: par exemple, dans linq, les agrégats sur un groupby sont externes au groupby, alors que dans SQL ils sont internes: ils doivent être dans la même portée comme le groupby autrement ils ne fonctionneront pas. Ce type d'information est nécessaire pour convertir les requêtes linq en requêtes SQL mais aussi dans l'autre sens. Donc, pour stocker les requêtes, j'avais choisi une route différente, par exemple. un modèle de spécification

1

Je ne crois pas qu'il y ait quelque chose de intégré dans LINQ-to-SQL.

En théorie, j'ose dire que ce serait possible (bien que cela ne garantisse pas un aller-retour, car il existe différentes façons d'exprimer la même requête) - mais très difficile à faire.

0

Ce qui peut éventuellement vous aider - LINQPad. Je suppose, il ne peut pas traduire SQL en requête LINQ, mais il peut traduire LINQ en SQL.

Une option consisterait à effectuer le suivi à partir du code IL généré par SQL. Par exemple:

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

Génère:

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 

De cette façon, il est tout à fait évident, cette requête LINQ ressemblerait à ceci:

pamparam.Take (50) 
+0

Oh d * mn ... Question était - si c'est possible de le faire par programmation. : / –