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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值