我的编程空间,编程开发者的网络收藏夹
学习永远不晚

LINQ中怎么动态修改表名称

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

LINQ中怎么动态修改表名称

LINQ中怎么动态修改表名称,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

LINQ TO SQL动态修改表名称的操作:

最近有点空闲时间,抽空看了一下LINQ方面的东西。好在园子里这方面的系列文章很多. 免去了不少查找的时间. 因为本人习惯于学完就动手尝试,而我们的产品中也都将访问数据库的SQL语句统一封装进了DLL.所以就想先拿产品练一下手:)

但万事开头难,一用上才发现有一个不大不小的问题挡在了面前.就是使用LINQ TO SQL模板生成代码后,会在相应的数据库实体类上绑定一个tablename属性.如下代码:

[Table(Name="dbo.dnt_users")]  public partial class Userinfo :   INotifyPropertyChanging,   INotifyPropertyChanged  {

dnt_users是数据库中的物理表.而我们的产品有一个特性,就是允许用户定制表名称的前缀.其实"dnt_"就是表的前缀名.而这个值(前缀)是通过产品中的Tableprefix属性获取的.Tableprefix属性返回的值是通过dnt.config中配置的.

所以这就要求在程序运行时动态加载表(前缀)名称.所在本人在网上开始四处找这方面的文章和资料.但找到的并不是特别对症。因为才自己动手实验一下,看看有什么好方法:)

LINQ TO SQL动态修改表名称尝试1:

通过常量方式将表属性[Table(Name="dbo.dnt_users")]替换成:

[Table(Name="dbo." + DntDataContext.tableprefix +"users")]

而tabalprefix定义如下:

public const string tableprefix = "dnt_";   [System.Data.Linq.Mapping.  DatabaseAttribute(Name="dnt_2")]  public partial class DntDataContext :   System.Data.Linq.DataContext  {   public const string tableprefix = "dnt_";   }

虽然这种方式将前台的名称抽取出来,将因为是采用常量方式,所以无法进行动态绑定.所以这次尝试是失败的.

LINQ TO SQL动态修改表名称尝试2:

替换DataContext生成的CommandText内容因为LINQ TO SQL最终还是被翻译成SQL,所以本人又使用下面的方法进行测试:

DntDataContext ddc = new DntDataContext();  var exp = from u in ddc.Userinfo  orderby u.uid ascending  select u  string query =   ddc.GetCommand(exp).CommandText.Replace("dnt_", "daizhj_");  var result = ddc.ExecuteQuery<Userinfo>(query, 0);  Console.WriteLine(((Userinfo[])   result.ToArray())[0].username);

上面代码段的ddc.GetCommand(exp).CommandText.Replace("dnt_", "daizhj_")是做的这个工作.虽然这次采用替换方式解决了问题.但看了代码的朋友会发现,代码变得很丑,本人也是这么看的.即使封装了也是很难受.没办法,放弃:(

LINQ TO SQL动态修改表名称尝试3: 继承并实现IQuerable接口

好在Matt Warren在他的文章中提到过如果建立一个IQueryable Provider(已修改, 更多内容参见这里).另外LoveCherry也将这篇文章翻译了过来,大家有兴趣不妨看一下,很有意思,  详情点击这里:)

所以本人就直接使用了他在文中所说的方式.将DNTDataContext做了修改如下:

[System.Data.Linq.Mapping.DatabaseAttribute(Name="dnt_2")]  public partial class DntDataContext :   System.Data.Linq.DataContext  {   public Query<Userinfo> Userinfos;   //该Query继承自IQueryable  public DntDataContext(System.Data.IDbConnection connection) :  base(connection, mappingSource)   {  QueryProvider provider =   new DbQueryProvider((DbConnection)connection);  this.Userinfos = new Query<Userinfo>(provider);   }  }

前端使用代码如下:

using (SqlConnection con =   new SqlConnection(global::Demo.Properties.  Settings.Default.dnt_2ConnectionString))  {   con.Open();   DntDataContext ddc = new DntDataContext(con);    IQueryable<Userinfo> query = from u in ddc.Userinfos  where (u.uid > 1)  select u;   foreach (Userinfo user in query.ToArray())   {  Console.WriteLine(user.username);   }    Console.ReadLine();  }

当然数据库链接对象可以封装到DntDataContext中,让代码的整体感觉更LINQ一些.相关的代码下载会在本文结尾处给出,详见LINQ.KIT代码中DbQueryProvider.cs文件.(相关修改已通过注释给出).

这次改动整体上能够满足查询上的需求,但是如果想使用相应的insert,update,delete也能做到相应的表名替换的话,还是要从System.Data.Linq.Table入手.即让

using (SqlConnection con = new SqlConnection(  global::Demo.Properties.Settings.  Default.dnt_2ConnectionString))  {    con.Open();    DntDataContext ddc = new DntDataContext(con);    IQueryable<Userinfo> query = from u in ddc.Userinfos  where (u.uid > 1)  select u;     foreach (Userinfo user in query)   {  Console.WriteLine(user.username);   }    Console.ReadLine();  }

返回的Userinfo类所绑定的表是被替换完成的表名称. 因为本人时间和精力有限,无法再去做进一步的研究了.但老赵的这篇文章给了我一些启发.其中下面的代码段就是他用来扩展DELETE功能的方法

 public static int Delete<TEntity>  (this Table<TEntity> table,   Expression<Func<TEntity, bool>> predicate)  where TEntity : class  {  string tableName =   table.Context.Mapping.GetTable(  typeof(TEntity)).TableName;  string command = String.Format(  "DELETE FROM {0}", tableName);   ConditionBuilder conditionBuilder =   new ConditionBuilder();  conditionBuilder.Build(predicate.Body);   if (!String.IsNullOrEmpty(  conditionBuilder.Condition))  {   command += " WHERE " + conditionBuilder.Condition;  }   return table.Context.ExecuteCommand(  command, conditionBuilder.Arguments);  }

关于LINQ中怎么动态修改表名称问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

LINQ中怎么动态修改表名称

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

LINQ中怎么动态修改表名称

LINQ中怎么动态修改表名称,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。LINQ TO SQL动态修改表名称的操作:最近有点空闲时间,抽空看了一下LINQ方面的东西。好在
2023-06-17

plsql怎么修改表字段名称

在PL/SQL中,可以使用ALTER TABLE语句来修改表字段的名称。语法如下:ALTER TABLE table_name RENAME COLUMN old_column_name TO new_column_name;其中,tabl
2023-10-11

oracle怎么修改表字段名称

要修改表字段名称,可以使用ALTER TABLE语句。以下是一个示例:ALTER TABLE table_name RENAME COLUMN old_column_name TO new_column_name;在这个示例中,替换tab
oracle怎么修改表字段名称
2024-04-09

weblogic怎么修改域名名称

要修改WebLogic域的名称,需要执行以下步骤:停止WebLogic域。可以使用stopWebLogic.sh(Linux/Unix)或stopWebLogic.cmd(Windows)脚本来停止域。在WebLogic域的config目录
weblogic怎么修改域名名称
2024-04-09

centos中怎么修改磁盘名称

在CentOS中,可以通过以下步骤修改磁盘名称:查看当前系统中的磁盘信息:lsblk找到需要修改名称的磁盘的设备路径,例如/dev/sdb。使用e2label命令修改磁盘的标签名称,例如将/dev/sdb的标签名称修改为new_label:
centos中怎么修改磁盘名称
2024-03-07

jquery怎么修改class名称

这篇文章主要介绍“jquery怎么修改class名称”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“jquery怎么修改class名称”文章能帮助大家解决问题。具体步骤如下:1.首先,新建一个html
2023-06-05

linux怎么修改设备名称

在Linux系统中,可以通过以下步骤来修改设备名称:打开终端,以管理员身份登录系统。使用以下命令查看当前设备的名称:sudo lshw -C network记下你想要修改的设备的名称。使用以下命令编辑网络配置文件(以eth0为例):su
linux怎么修改设备名称
2024-02-29

linux怎么修改串口名称

要修改Linux系统中的串口名称,可以按照以下步骤操作:打开终端窗口,输入以下命令以编辑udev规则文件:sudo nano /etc/udev/rules.d/99-serial-ports.rules在打开的文件中,添加以下内容(根据
2023-10-24

gitlab怎么修改账号名称

GitLab是一个强大的代码托管平台。当您在GitLab上注册一个账号后,有时候您可能需要修改自己的账号名称。这篇文章将向您介绍如何修改GitLab账号名称。登录GitLab账号首先,您需要登录您的GitLab账号。进入账户设置在页面右上角
2023-10-22

mysql怎么修改字段名称

在MySQL中,可以使用ALTER TABLE语句来修改字段名称。语法如下:mysqlALTER TABLE table_name CHANGE old_column_name new_column_name column_definiti
2023-10-20

linq中怎么实现动态排序

本篇文章为大家展示了linq中怎么实现动态排序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。想实现linq动态排序就是linq的order by 后跟动态的函数可以用委托实现,但是发现实现委托函数时
2023-06-17

git怎么修改分支名称

Git是一种分布式版本控制系统,常常用于多人协作开发。在Git中,分支是非常重要的概念。每个开发者都可以新建并切换到不同的分支来开发和测试不同的特性。但是,有时候我们会发现自己的分支名称并不太合适,需要修改分支名称。那么,Git分支名称如何
2023-10-22

navicat怎么修改连接名称

要修改 navicat 中的连接名称,请依次执行以下步骤:右键单击要修改名称的连接,选择“连接属性”。在“连接属性”窗口中,清除“名称”字段中的现有名称并输入新名称。单击“确定”按钮保存更改。如何修改 Navicat 中的连接名称步骤 1
navicat怎么修改连接名称
2024-04-24

mongodb怎么修改集合名称

要修改MongoDB中的集合名称,可以使用db.collection.renameCollection()方法。以下是如何修改集合名称的示例:db.collection.renameCollection("newCollectionNam
mongodb怎么修改集合名称
2024-04-09

gbase怎么修改字段名称

在gbase中修改字段名称可以通过ALTER TABLE语句来实现。具体步骤如下:打开gbase客户端,连接到相应的数据库。使用以下语法来修改字段名称:ALTER TABLE table_name CHANGE old_column_nam
gbase怎么修改字段名称
2024-03-15

sql怎么修改字段名称

要修改数据库表的字段名称,可以使用ALTER TABLE语句,如下所示:ALTER TABLE table_name CHANGE old_column_name new_column_name column_definition;其中,
sql怎么修改字段名称
2024-05-21

LINQ中怎么实现动态查询

今天就跟大家聊聊有关LINQ中怎么实现动态查询,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。LINQ动态查询实现实例:case L: case l: NextChar(); i
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录