【问题标题】:Dynamic LINQ2SQL to an unmapped table动态 LINQ2SQL 到未映射的表
【发布时间】:2023-04-06 13:18:01
【问题描述】:

我正在使用一个允许客户创建和导入自定义表的应用程序。我需要允许这些客户针对导入的自定义表构建动态查询,并且我希望能够使用 LINQ 来执行此操作。

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

有没有办法在运行时动态创建 DataContext 和映射对象以用于动态 Linq 查询?

有没有其他方法可以做到这一点而不求助于字符串构建的 sql?

【问题讨论】:

  • 这是通过结合使用反射发射调用来动态构建类型和使用亚音速 IQueryable 引擎来完成的。

标签: c# linq linq-to-sql


【解决方案1】:

有一些 T4 模板可用于创建 Linq to SQL 数据类。也许你可以调整这些。

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

我可以想到两种方法来生成程序集,而不需要 Microsoft C# 编译器或 Visual Studio。第一种是使用System.Reflection.Emit 生成自定义程序集。这可能比听起来容易;看看下面的反射器插件:

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# 编译器也是开源的。

【讨论】:

  • 这是一个有趣的想法。我相信这仍然需要 Visual Studio 针对 T4 模板进行解析和生成。我也可以使用另一个代码生成器(例如 CodeSmith)来获得类似的结果,但据我所知,两者都需要编译才能将类挂接到 DataContext 中。
  • 所以到目前为止的答案是必须进行某种类型的动态编译才能为 Linq 构建类和数据上下文。有几个用于动态编译的资源。我会朝那个方向努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多