2009-12-03 4 views
1

Je travaille avec une application qui permet aux clients de créer et d'importer des tables personnalisées. J'ai besoin de permettre à ces clients de créer des requêtes dynamiques sur les tables personnalisées importées et j'aimerais pouvoir utiliser LINQ pour cela.Dynamic LINQ2SQL à une table non mappée

Je suis familier avec la façon de créer des requêtes Dynamic LINQ mais toutes les méthodes que je connais nécessitent un objet mappé existant sur l'objet DataContext. Étant donné que les utilisateurs peuvent créer des tables personnalisées lors de l'exécution (via une chaîne SQL dynamique), aucun objet mappé ne figure dans un DataContext.

Existe-t-il un moyen de créer dynamiquement un objet DataContext et mappé au moment de l'exécution pour une utilisation avec une requête Linq dynamique?

Existe-t-il un autre moyen de le faire sans avoir recours à la chaîne SQL?

+0

Cela a été fait en utilisant une combinaison d'appels d'émission de réflexion pour construire dynamiquement le type et en utilisant le moteur subsonique IQueryable. – Firestrand

Répondre

0

Certains modèles T4 sont disponibles pour la création de classes de données Linq to SQL. Peut-être pouvez-vous les adapter.

http://www.pnpguidance.net/Post/LINQToSQLCodeGenerationT4TemplatesTutorials.aspx

Il y a deux façons que je peux penser pour générer l'assemblage sans nécessiter le compilateur Microsoft C# ou Visual Studio. La première consiste à utiliser System.Reflection.Emit pour générer un assemblage personnalisé. Cela pourrait être plus facile que ça en a l'air. un coup d'oeil à l'adresse suivante add-in pour réflecteur:

ReflectionEmitLanguage Add-in pour réflecteur
http://reflectoraddins.codeplex.com/wikipage?title=ReflectionEmitLanguage&referringTitle=Home

Ce que le complément n'est de prendre un ensemble IL existant et créer du code C# qui contient le System.Reflection.Emit appelle qu'il faudrait pour générer le même IL que le compilateur C# le ferait. Donc, essentiellement, ce que vous feriez serait de créer un assemblage contenant un prototype DataContext, et exécutez ceci sur ses méthodes. Vous auriez alors une classe (ou la meilleure partie de celle-ci) qui va générer l'assembly IL directement. Tout ce code est open-source.

L'autre chose que vous pouvez faire est d'essayer d'utiliser le Mono C# compiler (qui peut être appelé comme un service, contrairement au compilateur Microsoft C#) pour générer votre assembly IL. Le compilateur C# est également open-source.

+0

C'est une idée intéressante. Je crois que cela nécessiterait toujours que Visual Studio analyse et génère par rapport au modèle T4. Je pourrais également éventuellement utiliser un autre générateur de code tel que CodeSmith pour obtenir des résultats similaires mais pour autant que je sache, les deux requerraient une compilation pour obtenir les classes hookées dans le DataContext. – Firestrand

+0

@Firestrand, voir mon édition. –

+0

Donc la réponse jusqu'à présent est qu'un certain type de compilation dynamique doit avoir lieu afin de construire les classes et le contexte de données pour Linq. Il existe plusieurs ressources pour la compilation dynamique. Je vais travailler dans cette direction. – Firestrand

Questions connexes