成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

LINQ TO SQL動態修改表名稱的實現淺析

開發 后端
LINQ TO SQL動態修改表名稱的實現的過程是什么呢?LINQ TO SQL動態修改表名稱的實現需要注意什么呢?我們在實際的操作中會遇到什么問題呢?希望通過這里的介紹對你有所幫助。

LINQ TO SQL動態修改表名稱的實現是如何的呢?我們在實際的操作過程中如何實現呢?需要注意什么呢?那么這里向你詳細說明一下,希望對你有所幫助。

LINQ TO SQL動態修改表名稱的操作:

最近有點空閑時間,抽空看了一下LINQ方面的東西。好在園子里這方面的系列文章很多. 免去了不少查找的時間. 因為本人習慣于學完就動手嘗試,而我們的產品中也都將訪問數據庫的SQL語句統一封裝進了DLL.所以就想先拿產品練一下手:)

但萬事開頭難,一用上才發現有一個不大不小的問題擋在了面前.就是使用LINQ TO SQL模板生成代碼后,會在相應的數據庫實體類上綁定一個tablename屬性.如下代碼:

  1. [Table(Name="dbo.dnt_users")]  
  2. public partial class Userinfo :   
  3. INotifyPropertyChanging,   
  4. INotifyPropertyChanged  

dnt_users是數據庫中的物理表.而我們的產品有一個特性,就是允許用戶定制表名稱的前綴.其實"dnt_"就是表的前綴名.而這個值(前綴)是通過產品中的Tableprefix屬性獲取的.Tableprefix屬性返回的值是通過dnt.config中配置的.

所以這就要求在程序運行時動態加載表(前綴)名稱.所在本人在網上開始四處找這方面的文章和資料.但找到的并不是特別對癥。因為才自己動手實驗一下,看看有什么好方法:)

LINQ TO SQL動態修改表名稱嘗試1:

通過常量方式將表屬性[Table(Name="dbo.dnt_users")]替換成:

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

而tabalprefix定義如下:

  1. public const string tableprefix = "dnt_";  
  2.  
  3. [System.Data.Linq.Mapping.  
  4. DatabaseAttribute(Name="dnt_2")]  
  5. public partial class DntDataContext :   
  6. System.Data.Linq.DataContext  
  7. {  
  8.  
  9. public const string tableprefix = "dnt_";  
  10.  
  11. }  

雖然這種方式將前臺的名稱抽取出來,將因為是采用常量方式,所以無法進行動態綁定.所以這次嘗試是失敗的.

LINQ TO SQL動態修改表名稱嘗試2:

替換DataContext生成的CommandText內容因為LINQ TO SQL最終還是被翻譯成SQL,所以本人又使用下面的方法進行測試:

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

上面代碼段的ddc.GetCommand(exp).CommandText.Replace("dnt_", "daizhj_")是做的這個工作.雖然這次采用替換方式解決了問題.但看了代碼的朋友會發現,代碼變得很丑,本人也是這么看的.即使封裝了也是很難受.沒辦法,放棄:(

LINQ TO SQL動態修改表名稱嘗試3: 繼承并實現IQuerable接口

好在Matt Warren在他的文章中提到過如果建立一個IQueryable Provider(已修改, 更多內容參見這里).另外LoveCherry也將這篇文章翻譯了過來,大家有興趣不妨看一下,很有意思,  詳情點擊這里:)

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

  1. [System.Data.Linq.Mapping.DatabaseAttribute(Name="dnt_2")]  
  2. public partial class DntDataContext :   
  3. System.Data.Linq.DataContext  
  4. {  
  5.  
  6. public Query<Userinfo> Userinfos;   
  7. //該Query繼承自IQueryable  
  8. public DntDataContext(System.Data.IDbConnection connection) :  
  9. base(connection, mappingSource)  
  10.  {  
  11. QueryProvider provider =   
  12. new DbQueryProvider((DbConnection)connection);  
  13. this.Userinfos = new Query<Userinfo>(provider);  
  14.  }  
  15. }  

前端使用代碼如下:

  1. using (SqlConnection con =   
  2. new SqlConnection(global::Demo.Properties.  
  3. Settings.Default.dnt_2ConnectionString))  
  4. {  
  5.  con.Open();  
  6.  DntDataContext ddc = new DntDataContext(con);  
  7.  
  8.  IQueryable<Userinfo> query = from u in ddc.Userinfos  
  9. where (u.uid > 1)  
  10. select u;  
  11.  foreach (Userinfo user in query.ToArray())  
  12.  {  
  13. Console.WriteLine(user.username);  
  14.  }  
  15.  
  16.  Console.ReadLine();  
  17. }  

當然數據庫鏈接對象可以封裝到DntDataContext中,讓代碼的整體感覺更LINQ一些.相關的代碼下載會在本文結尾處給出,詳見LINQ.KIT代碼中DbQueryProvider.cs文件.(相關修改已通過注釋給出).

這次改動整體上能夠滿足查詢上的需求,但是如果想使用相應的insert,update,delete也能做到相應的表名替換的話,還是要從System.Data.Linq.Table入手.即讓

  1. using (SqlConnection con = new SqlConnection(  
  2. global::Demo.Properties.Settings.  
  3. Default.dnt_2ConnectionString))  
  4. {  
  5.  
  6.  con.Open();  
  7.  
  8.  DntDataContext ddc = new DntDataContext(con);  
  9.  
  10.  IQueryable<Userinfo> query = from u in ddc.Userinfos  
  11. where (u.uid > 1)  
  12. select u;  
  13.  
  14.  
  15.  foreach (Userinfo user in query)  
  16.  {  
  17. Console.WriteLine(user.username);  
  18.  }  
  19.  
  20.  Console.ReadLine();  
  21. }  

返回的Userinfo類所綁定的表是被替換完成的表名稱. 因為本人時間和精力有限,無法再去做進一步的研究了.但老趙的這篇文章給了我一些啟發.其中下面的代碼段就是他用來擴展DELETE功能的方法

  1.  public static int Delete<TEntity>  
  2. (this Table<TEntity> table,   
  3. Expression<Func<TEntity, bool>> predicate)  
  4. where TEntity : class 
  5.  {  
  6. string tableName =   
  7. table.Context.Mapping.GetTable(  
  8. typeof(TEntity)).TableName;  
  9. string command = String.Format(  
  10. "DELETE FROM {0}", tableName);  
  11.  
  12. ConditionBuilder conditionBuilder =   
  13. new ConditionBuilder();  
  14. conditionBuilder.Build(predicate.Body);  
  15.  
  16. if (!String.IsNullOrEmpty(  
  17. conditionBuilder.Condition))  
  18. {  
  19.  command += " WHERE " + conditionBuilder.Condition;  
  20. }  
  21.  
  22. return table.Context.ExecuteCommand(  
  23. command, conditionBuilder.Arguments);  
  24. }  

我想應該可以在這里完成相應的表名稱的替換,實現起來也很容易.經過這一番折騰,我發現如果LINQ TO SQL 支持通過XML配置文件進行綁定才是最終的理想方案.因為本人又開始四處搜索這方面的信息,發現了這篇文章:)原來還真有,只是自己剛入門心急不知道,所以才兜了這么一大圈.看來以后還要認真耐心看文檔和相應的方法提示了, 好在這種低級錯誤也不是犯過一次兩次了:)

LINQ TO SQL動態修改表名稱的實現基本內容就向你介紹到這里,希望對你了解和學習使用LINQ TO SQL動態修改表名稱有所幫助。

【編輯推薦】

  1. LINQ嵌套查詢實現淺析
  2. LINQ查詢方式的探尋
  3. LINQ查詢的效果分析
  4. LINQ查詢和泛型類型的關系淺析
  5. LINQ動態查詢的實現淺析
責任編輯:仲衡 來源: ittang.com
相關推薦

2009-09-14 19:14:51

LINQ動態查詢

2009-09-14 09:46:00

LINQ to SQL

2009-09-17 17:34:23

linq to sql

2009-09-10 18:02:23

LINQ to SQL

2009-09-16 17:11:35

LINQ To SQL

2009-09-15 09:19:22

linq動態條件

2009-09-15 10:12:37

LINQ To SQL

2009-09-17 18:05:15

linq to sql

2009-09-14 16:29:39

LINQ嵌套

2009-09-14 17:40:47

LINQ To SQL

2009-09-14 18:23:59

LINQ嵌套查詢

2009-09-10 10:09:46

LINQ to SQL

2009-09-17 08:47:00

Linq插入數據

2009-09-17 16:46:34

Linq to sql

2009-09-18 15:15:12

LINQ to SQL

2009-12-23 09:04:41

LINQ通用分頁

2009-09-14 19:55:03

LINQ事務處理

2009-09-18 14:25:36

LINQ to SQL

2009-09-15 14:30:11

Linq連接

2011-04-07 14:04:28

SQL動態交叉表
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩午夜精品 | 欧美高清视频一区 | 久久久久久久久久性 | 国产成人99久久亚洲综合精品 | 国产精品永久免费观看 | 国产在线激情视频 | 男女国产网站 | 中国免费黄色片 | 91资源在线观看 | 欧美日韩亚洲一区 | 一区二区三区亚洲 | 日韩美女在线看免费观看 | 91视频麻豆 | 久久久久久www | 亚洲毛片在线观看 | 久久久久综合 | 男女视频在线看 | 亚洲成人免费 | 中文字幕福利 | 麻豆久久久久久久久久 | 欧美日韩亚洲视频 | www.99精品| 日韩成人一区 | 亚洲国产精品成人无久久精品 | 精品国产乱码久久久久久丨区2区 | 日韩精品一区二区三区在线播放 | 国产精品日韩欧美一区二区 | 91视频在线 | 日本一级淫片免费啪啪3 | 99久久婷婷国产综合精品电影 | 久久精品一区 | 久久久久国产一区二区三区四区 | 成人午夜在线 | 天天久久 | 日韩综合网 | 亚洲在线中文字幕 | 国产精品福利久久久 | av在线免费观看不卡 | 97国产精品视频人人做人人爱 | 久久国产一区二区 | 亚洲视频欧美视频 |