日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
LINQTOSQL動態(tài)修改表名稱的實現(xiàn)淺析

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

網(wǎng)站制作、成都網(wǎng)站建設(shè)過程中,需要針對客戶的行業(yè)特點、產(chǎn)品特性、目標(biāo)受眾和市場情況進(jìn)行定位分析,以確定網(wǎng)站的風(fēng)格、色彩、版式、交互等方面的設(shè)計方向。成都創(chuàng)新互聯(lián)還需要根據(jù)客戶的需求進(jìn)行功能模塊的開發(fā)和設(shè)計,包括內(nèi)容管理、前臺展示、用戶權(quán)限管理、數(shù)據(jù)統(tǒng)計和安全保護(hù)等功能。

LINQ TO SQL動態(tài)修改表名稱的操作:

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

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

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

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

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

LINQ TO SQL動態(tài)修改表名稱嘗試1:

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

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

而tabalprefix定義如下:

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

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

LINQ TO SQL動態(tài)修改表名稱嘗試2:

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

 
 
 
  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(query, 0);
  8. Console.WriteLine(((Userinfo[]) 
  9. result.ToArray())[0].username);

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

LINQ TO SQL動態(tài)修改表名稱嘗試3: 繼承并實現(xiàn)IQuerable接口

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

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

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

前端使用代碼如下:

 
 
 
  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.  IQueryable query = from u in ddc.Userinfos
  8. where (u.uid > 1)
  9. select u;
  10.  foreach (Userinfo user in query.ToArray())
  11.  {
  12. Console.WriteLine(user.username);
  13.  }
  14.  Console.ReadLine();
  15. }

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

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

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

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

 
 
 
  1.  public static int Delete
  2. (this Table table, 
  3. Expression> 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. ConditionBuilder conditionBuilder = 
  12. new ConditionBuilder();
  13. conditionBuilder.Build(predicate.Body);
  14. if (!String.IsNullOrEmpty(
  15. conditionBuilder.Condition))
  16. {
  17.  command += " WHERE " + conditionBuilder.Condition;
  18. }
  19. return table.Context.ExecuteCommand(
  20. command, conditionBuilder.Arguments);
  21. }

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

LINQ TO SQL動態(tài)修改表名稱的實現(xiàn)基本內(nèi)容就向你介紹到這里,希望對你了解和學(xué)習(xí)使用LINQ TO SQL動態(tài)修改表名稱有所幫助。


本文標(biāo)題:LINQTOSQL動態(tài)修改表名稱的實現(xiàn)淺析
當(dāng)前路徑:http://www.5511xx.com/article/djopeec.html