Reconvertir requête SQL à l'expression Linq programme
-
23-08-2019 - |
Question
Est-il possible de convertir en quelque sorte une programmation requête SQL à un arbre d'expression LINQ? La requête SQL est censé être généré par cette requête LINQ, donc je pense comme un pauvre sérialisation de l'homme s \ désérialisation de requêtes LINQ au format t-sql.
Merci.
La solution
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 le convertir en un arbre d'expression LINQ. Ce n'est pas trivial, comme Linq est pas 1: 1 compatible avec sql: par exemple, dans LINQ, des 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 groupby sinon ils ne fonctionneront pas. Ce genre d'information est nécessaire pour convertir les requêtes LINQ en requêtes SQL, mais aussi l'inverse.
Donc, pour les requêtes magasin, je choisi un itinéraire différent, par exemple un motif de spécification
Autres conseils
Je ne crois pas qu'il y ait quoi que ce soit intégré dans LINQ to SQL.
En théorie, j'ose dire que ce serait possible (même si elle ne garantirait pas roundtrip, car il existe différentes façons d'exprimer la même requête) -. Mais très difficile à faire bien
Chose ce qui peut éventuellement vous aider - LINQPad. Je suppose, il ne peut pas traduire SQL requête LINQ, mais il peut traduire LINQ to SQL.
L'une des options serait de suivre de SQL généré le code IL. 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)