动态LINQ2SQL未映射表

问题描述:

我与一个应用程序,允许用户创建和导入自定义表工作。我有需要允许这些客户建立对导入的自定义表的动态查询,我希望能够使用LINQ来做到这一点。动态LINQ2SQL未映射表

我熟悉不过了如何创建动态LINQ查询我所知道的要求DataContext对象上的现有映射对象的方法。由于用户能够在运行时创建自定义表(通过动态字符串构建的SQL),因此在任何DataContext中都没有映射对象。

有没有办法来动态在运行时创建一个DataContext和映射对象与动态Linq查询使用?

有一些其他的方式来做到这一点,而不诉诸字符串内置SQL?

+0

这是通过使用反射发射调用的组合来动态构建类型并使用亚音速IQueryable引擎完成的。 – Firestrand 2010-01-29 20:09:44

有可用于创建一个LINQ to SQL数据类中的某些T4模板。也许你可以适应这些。

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

有迹象表明,我能想到的两种方法生成的装配,而不需要微软的C#编译器或Visual Studio。首先是使用System.Reflection.Emit来生成自定义程序集。这可能比听起来容易;看看下面附加的反射器:

ReflectionEmitLanguage外接反射
http://reflectoraddins.codeplex.com/wikipage?title=ReflectionEmitLanguage&referringTitle=Home

什么外接所做的是利用现有的IL组装和创建C#代码包含调用它将生成与C#编译器相同的IL。所以基本上你会做的是创建一个包含原型DataContext组件,并在它的方法运行此。然后你将有一个类(或者更好的部分)直接生成IL程序集。所有这些代码都是开源的。

你可以做的另一件事是尝试使用Mono C# compiler(它可以像一个服务,不像微软的C#编译器)来生成你的IL程序集。 C#编译器也是开源的。

+0

这是一个有趣的想法。我相信仍然需要Visual Studio解析并生成T4模板。我也可以使用CodeSmith等其他代码生成器来获得类似的结果,但据我所知,两者都需要编译才能将类挂钩到DataContext中。 – Firestrand 2009-12-03 21:47:49

+0

@Firestrand,看我的编辑。 – 2009-12-03 22:53:32

+0

所以到目前为止的答案是,为了构建Linq的类和数据上下文,必须进行某种类型的动态编译。有几个资源用于动态编译。我会朝这个方向努力。 – Firestrand 2009-12-07 15:11:50