自定义Linq到SQL映射源
本文关键字:映射 SQL Linq 自定义 | 更新日期: 2023-09-27 18:01:13
我有一个项目,它将编译的实体框架域与动态定义的外部数据库混合在一起。用户可以在运行时提供连接字符串、表名和列名以访问外部系统。我以前一直在使用动态生成的SQL来访问外部系统(当然,为了避免SQL注入,我精心制作了(,并将感兴趣的表读取到DataTable
的表中,并将其具体化为POCO的表。
现在,我90%的视图使用IQueryable
对象来检查DB查询的结构,并有效地格式化/分页/操作视图。这使我能够在执行查询之前对做大量的工作。对于涉及外部系统记录的视图,我只是咬紧牙关,使用IEnumerable.AsQueryable()
。
我非常想使用不同的解决方案。我倾向于Linq-to-SQL(我对其他建议持开放态度(,但我一直致力于创建动态MappingSource
。此外,有些列是可选的,如果我不为每一列提供映射,我不知道Linq到SQL是否会崩溃。
public class ExternalMappingSource : MappingSource
{
public string[] KeyColumns { get; set; }
public string NameColumn { get; set; }
public string DescriptionColumn { get; set; }
public string TimestampColumn { get; set; }
protected override MetaModel CreateModel(Type dataContextType)
{
// ???
}
}
我在网上找不到任何好的资源。我该如何打发这节课?
如果您预先了解相关结构(表和字段值(,则可以基于该数据输入自定义映射源,而无需事先获得对象。对我来说,出于另一个原因,我最终使用了XmlMappingSource对象,因为它有一个.FromXml((方法,您可以使用它来输入任意Xml。如果检查sqlmetal:生成的映射文件,您可以了解所需Xml的结构
- 打开VS命令提示符(它位于"开始"菜单中的Visual Studio Tools文件夹中(
- 将目录更改为您的项目
- 输入命令"sqlmetal/map:whatever.map/code yourlinqtosql.dbml"。这将生成一个格式化为Xml的whatever.ma普文件
根据需要以编程方式进行更改,以提供给XmlMappingSource.FromXml((方法。然后,您可以使用相关的连接字符串和更改后的映射源创建上下文。