2009-12-03 63 views
1

我與一個應用程序,允許用戶創建和導入自定義表工作。我有需要允許這些客戶建立對導入的自定義表的動態查詢,我希望能夠使用LINQ來做到這一點。動態LINQ2SQL未映射表

我熟悉不過了如何創建動態LINQ查詢我所知道的要求DataContext對象上的現有映射對象的方法。由於用戶能夠在運行時創建自定義表(通過動態字符串構建的SQL),因此在任何DataContext中都沒有映射對象。

有沒有辦法來動態在運行時創建一個DataContext和映射對象與動態Linq查詢使用?

有一些其他的方式來做到這一點,而不訴諸字符串內置SQL?

+0

這是通過使用反射發射調用的組合來動態構建類型並使用亞音速IQueryable引擎完成的。 – Firestrand 2010-01-29 20:09:44

回答

0

有可用於創建一個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