我正在使用一个允许客户创建和导入自定义表的应用程序。我需要允许这些客户针对导入的自定义表构建动态查询,我希望能够使用LINQ来执行此操作。
我熟悉如何创建动态LINQ查询,但是我所知道的所有方法都需要DataContext对象上的现有映射对象。由于用户可以在运行时创建自定义表(通过动态字符串构建的SQL),因此任何DataContext中都没有映射对象。
有没有办法在运行时动态创建DataContext和映射对象,以便与动态Linq查询一起使用?
有没有其他方法可以在不使用字符串构建的sql的情况下执行此操作?
答案 0 :(得分:0)
有一些T4模板可用于创建Linq to SQL数据类。也许你可以适应那些。
http://www.pnpguidance.net/Post/LINQToSQLCodeGenerationT4TemplatesTutorials.aspx
我可以通过两种方式来生成程序集而无需Microsoft C#编译器或Visual Studio。第一种是使用System.Reflection.Emit
生成自定义程序集。这可能比听起来容易;看一下Reflector的以下加载项:
Reflector的ReflectionEmitLanguage加载项 http://reflectoraddins.codeplex.com/wikipage?title=ReflectionEmitLanguage&referringTitle=Home
加载项的作用是使用现有的IL程序集并创建包含System.Reflection.Emit
调用的C#代码,这些调用将生成与C#编译器相同的IL。所以你要做的就是创建一个包含原型DataContext
的程序集,并在其方法上运行它。然后,您将拥有一个将直接生成IL程序集的类(或更好的一部分)。所有这些代码都是开源的。
您可以做的另一件事是尝试使用Mono C# compiler(可以像服务一样调用,与Microsoft C#编译器不同)来生成IL程序集。 C#编译器也是开源的。