LinqToSQL下实现动态表名的映射
提出问题
前段时间,在博客园里看到有位朋友,问如何实现在动态表名。我们都知道,把一个实体类映谢到表里,应该这样写:
[Table(Name="User")]
classUser
{
[Column]
publicintID;
[Column]
publicstringName;
}
很明显,这里的表名是写死的,有些时候,我们可能要根据不同的情况实现不同的表名里加个前缀或者后缀,例如:
tt_User,aa_User,User1、User2。
分析问题
要解决这个问题,首先我们就要明白一个问题,DataContext是如何将实体到表的映射的,事实上,它是例用MappingSource提供的信息来进行映射的。要解决上面的问题,我就是需要重新构一个继承于MappingSource的类。
解决问题
代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Data.Linq;
usingSystem.Data.Linq.Mapping;
usingSystem.Diagnostics;
usingSystem.Globalization;
usingSystem.Linq;
usingSystem.Reflection;
usingSystem.Text;
usingSystem.Xml.Schema;
namespaceALinq.Mapping
{
classDynamicMappingSource:MappingSource
{
classDynamicAttributedMetaModel:MetaModel
{
privateMetaModelsource;
privateconststringTypeName="System.Data.Linq.Mapping.AttributedMetaModel";
privateDynamicMappingSourcemappingSource;
internalDynamicAttributedMetaModel(MappingSourcemappingSource,TypecontextType)
{
this.mappingSource=(DynamicMappingSource)mappingSource;
varbf=BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.CreateInstance;
varargs=newobject[]{mappingSource,contextType};
source=typeof(DataContext).Assembly.CreateInstance(TypeName,false,bf,null,
args,CultureInfo.CurrentCulture,null)asMetaModel;
Debug.Assert(source!=null);
}
publicoverrideMetaTableGetTable(TyperowType)
{
if(mappingSource.GetMetaTableName!=null)
{
vartypeName="System.Data.Linq.Mapping.AttributedMetaTable";
varbf=BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.CreateInstance;
varattribute=newTableAttribute{Name=mappingSource.GetMetaTableName(rowType)};
varargs=newobject[]{source,attribute,rowType};
varmetaTable=typeof(DataContext).Assembly.CreateInstance(typeName,false,bf,null,
args,CultureInfo.CurrentCulture,null)asMetaTable;
returnmetaTable;
}
returnsource.GetTable(rowType);
}
publicoverrideMetaFunctionGetFunction(MethodInfomethod)
{
returnsource.GetFunction(method);
}
publicoverrideIEnumerable<MetaTable>GetTables()
{
returnsource.GetTables();
}
publicoverrideIEnumerable<MetaFunction>GetFunctions()
{
returnsource.GetFunctions();
}
publicoverrideMetaTypeGetMetaType(Typetype)
{
returnsource.GetMetaType(type);
}
publicoverrideMappingSourceMappingSource
{
get{returnsource.MappingSource;}
}
publicoverrideTypeContextType
{
get{returnsource.ContextType;}
}
publicoverridestringDatabaseName
{
get{returnsource.DatabaseName;}
}
publicoverrideTypeProviderType
{
get{returnsource.ProviderType;}
}
}
publicFunc<Type,string>GetMetaTableName;
protectedoverrideMetaModelCreateModel(TypedataContextType)
{
if(dataContextType==null)
{
thrownewArgumentNullException("dataContextType");
}
returnnewDynamicAttributedMetaModel(this,dataContextType);
}
}
[Table(Name="User")]
classUser
{
[Column]
publicintID;
[Column]
publicstringName;
}
classProgram
{
staticvoidMain(string[]args)
{
varmappingSource=newDynamicMappingSource();
inti=0;
mappingSource.GetMetaTableName=delegate(Typetype)
{
varatt=type.GetCustomAttributes(typeof(TableAttribute),true).Single()
asTableAttribute;
Debug.Assert(att!=null);
returnatt.Name+i;
};
varconstr=@"DataSource=NOTEBOOKSQLEXPRESS;InitialCatalog=DemoDataContext;IntegratedSecurity=True";
varcontext=newDataContext(constr,mappingSource){Log=Console.Out};
i=1;
context.GetTable<User>().Select(o=>o).ToList();
i=2;
context.GetTable<User>().Select(o=>o).ToList();
}
}
}
转载于:https://www.cnblogs.com/hdxhan/archive/2011/12/14/2287533.html
LinqToSQL下实现动态表名的映射相关推荐
- mysql下解决动态表名
之前在编写一段sql,内容如下:show create table ? 用占位符占了表名的坑,目的是查询建表语句,使用的模块是jdbcTemplate. 然而我发现,查询出来的结果是sql语法有 ...
- hibernate动态表名映射
为什么80%的码农都做不了架构师?>>> 最近用Hibernate做一个项目的时候遇到这么一个问题: 用一个配置文件,一个类去映射多个表,(每个表的结构相同).按照平时的做法 ...
- MybatisPlus:SQL语句打印、SQL分析、自定义主键值策略填充(IdType.INPUT)、动态表名、多租户、枚举、类型处理器、连表自定义SQL(使用wrapper)
文章目录 1. 简单使用以及配置 - 带分页配置 2. 用法 2.0 Wrapper属性 2.1 @TableId - 自定义主键生成策略 2.2 @TableField - 自定义字段值填充 2.3 ...
- 使用dao时,如何同时使用动态表名和过滤字段?
使用dao时,如何同时使用动态表名和过滤字段? 发布于 630天前 作者 wukonggg 316 次浏览 复制 上一个帖子 下一个帖子 标签: 无 如题.求样例代码 1 回复 wenda ...
- MyBatis-Plus动态表名插件使用
一.MyBatis-Plus动态表名插件使用 官方文档-动态表名插件:https://baomidou.com/pages/2a45ff/#dynamictablenameinnerintercept ...
- linux 下 设置 MySQL8 表名大小写不敏感方法,解决设置后无法启动 MySQL 服务的问题
linux 下 设置 MySQL8 表名大小写不敏感方法,解决设置后无法启动 MySQL 服务的问题 参考文章: (1)linux 下 设置 MySQL8 表名大小写不敏感方法,解决设置后无法启动 M ...
- mysql event scheduler机制 与 动态表名创建
mysql event scheduler机制 与 动态表名创建 今天有一个需求,需要定时在mysql创建表与删除表,以及根据日期命名表名.诚然,通过外部程序很容易实现与控制这一切. 但是需要额外的服 ...
- mybatis获取表名_mybatis plus 的动态表名的配置详解
mybatis plus简介 详见mybatis plus的官网 业务要求 业务上要求存储数据的时候根据某个字段动态的选择数据要存储的表. 如根据code字段: code->[1001,1002 ...
- mysql 动态创建事件_mysql 通过事件定时为数据库创建动态表名
#检测事件是否开启 show variables like 'event_scheduler'; #开启事件(最好在my.init设置,因为重启后还会变回默认值OFF) set global even ...
- mysql 获取一个库下的所有表名
http://dev.mysql.com/doc/refman/5.1/zh/information-schema.html 官网上的第一个例子: mysql> SELECT table_nam ...
最新文章
- Spark 源码分析 -- RDD
- mimind(思维导图软件)中文版
- word2016配置Mathtype
- 在使用多表的查询显示的时候 建议使用视图
- Spring@Autowired注解
- Gui+jdbc+mysql实现图书管理
- 学习Java 第 4天 流程控制语句 one大白(●—●)
- php和python-PHP与Python语言有哪些区别之处?选择哪一个好?
- (笔记)Linux内核学习(三)之进程调度
- 使用POI导出数据以及性能比较
- mac上的实用工具(mac常用工具)
- trend函数用oracle实现,Excel函数TREND函数的用法
- linux和windows php pdf转图片,扩展安装imagick和ImageMagick
- jsp登陆界面链接mysql_用jsp实现网站登录界面的制作,并连接数据库
- Win10设置屏保时间
- 表示自己从头开始的句子_表示一切从头开始的唯美句子38条
- Ubuntu18.04之有道词典安装(五十九)
- 联想拯救者R720双系统如何进bios
- lansee无法双击进去计算机,局域网搜索LanSee工具,网管员神器
- 在Ubuntu16.04 中安装g2o并运行g2o_viewer
热门文章
- 解决办法:GLib-ERROR **: Creating pipes for GWakeup: Too many open files
- 凑热闹买了个小米剃须刀
- SHELL下根据进程号得到内存,并截取为整数
- vscode java
- for循环批量写文件 shell_Shell脚本编程03下——Shell编程之循环语句
- python中断言语句语法_Python的词法分析与语法分析
- python 宏定义_「Rust笔记」Rust之自定义宏写法
- express不是内部或外部命令的解决方法
- Mysql 5.6 在性能、可伸缩性、可用性方面的新突破二
- Excel—身份证生日提取