精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

LINQ To SQL和ORM的理解淺析

開發(fā) 后端
LINQ To SQL和ORM的理解是如何的呢?我們?cè)趯W(xué)習(xí)LINQ To SQL以及ORM的時(shí)候應(yīng)該注意什么呢?那么本文就向你介紹一些自己的學(xué)習(xí)體會(huì),希望對(duì)你有所幫助。

LINQ To SQL和ORM的理解是什么呢,這將會(huì)是我們掌握LINQ技術(shù)的關(guān)鍵,那么對(duì)于LINQ To SQL具體的是什么含義,那么操作我們是需要明確的呢?那么下面我們就向你講述一下關(guān)于LINQ To SQL和ORM的相關(guān)理解。

有N個(gè)用LINQ的理由,也有N個(gè)不用LINQ的理由。在完善框架的時(shí)候,電信的一位技術(shù)總監(jiān)跟我說:我不建議你做框架,那是微軟等大公司的事,我們主要是用框架,你現(xiàn)在寫ORM,現(xiàn)在的DotNet3.5 已經(jīng)處于Alpha測(cè)試階段了,你的ORM還有多大的用處。我當(dāng)時(shí)一下子迷惘了,趕快找資料,從Lamda表達(dá)式開始學(xué)起,對(duì)于我來說難度還是不少的(是在考驗(yàn)我的數(shù)學(xué)呀)。最終還是放棄了。

LINQ To SQL和ORM的理解1、

沒有LINQ的源代碼,不知道清楚中間的數(shù)據(jù)是如何處理的,特別是緩存是如何處理的。

LINQ To SQL和ORM的理解2、

用LINQ翻譯到存儲(chǔ)過程/Sql語(yǔ)句效率很低的,對(duì)于復(fù)雜的對(duì)效率有一定的要求的,還是要寫存儲(chǔ)過程。而且翻譯出來的存儲(chǔ)過程/Sql語(yǔ)句的怎么緩存,第二次執(zhí)行的時(shí)候還要重新翻譯,不能很好的利用緩存。

LINQ To SQL和ORM的理解3、工具的支持。

這一點(diǎn)是非常重要。如果沒有有力工具的支持,用ORM簡(jiǎn)直就是惡夢(mèng)。LINQ的工具支持總的來說,現(xiàn)在在VS2008里的支持我感覺還不是很友好。至少有一點(diǎn),我們通常在表的備注里面寫下這個(gè)字段的注釋,很多情況下對(duì)應(yīng)到界面上就是這個(gè)字段的抬頭,這個(gè)工具不能直接生成到項(xiàng)目里去,因?yàn)槲覀儾荒芸刂疲僬撸F(xiàn)在的項(xiàng)目都不是由一個(gè)人完成,如果一個(gè)類有幾十個(gè)字段,很難記住解釋,自己的工具可以加入注釋,方便開發(fā)。

LINQ To SQL和ORM的理解4、與業(yè)務(wù)層的綜合。

通常ORM映射就是把對(duì)象與關(guān)系表之間形成映射關(guān)系,映射的目標(biāo)是為了方便業(yè)務(wù)層的邏輯處理,如果不能與業(yè)務(wù)層無縫的結(jié)合起來,那么對(duì)于項(xiàng)目的開發(fā),也未必有多少好處。至少在的ORM里面,與的我業(yè)務(wù)層可以非常友好的集成在一起。

LINQ To SQL和ORM的理解5、多數(shù)據(jù)源的支持。

對(duì)于我來說,這點(diǎn)也是非常關(guān)鍵的。我說的多數(shù)據(jù)源是指一個(gè)項(xiàng)目里面,有多個(gè)數(shù)據(jù)庫(kù),比如:基礎(chǔ)數(shù)據(jù)、客戶管理、業(yè)務(wù)運(yùn)作、權(quán)限管理等,這些都是相對(duì)獨(dú)立的模塊,開發(fā)的時(shí)候,可以把這幾個(gè)作為單獨(dú)的項(xiàng)目開發(fā),各自有自己獨(dú)立的數(shù)據(jù)庫(kù),而且在多個(gè)項(xiàng)目里面,這些模塊都是非常相似,像權(quán)限模塊基本上是通用的,沒有必要再重復(fù)開發(fā)。如果能夠做到數(shù)據(jù)庫(kù)層分離,則新項(xiàng)目開發(fā)的時(shí)候,可以達(dá)到更快的速度。當(dāng)然也可以做到很容易的分合,把兩個(gè)數(shù)據(jù)庫(kù)合并成一個(gè),或者把一個(gè)數(shù)據(jù)庫(kù)分開成兩個(gè),只涉及到配置文件的更改,在開發(fā)的時(shí)候可以不關(guān)心的。

LINQ To SQL和ORM的理解6、對(duì)于可變查詢的處理。

也就是相當(dāng)于拼接字符串了。可能會(huì)說,這個(gè)是LINQ的強(qiáng)項(xiàng),但是,如果對(duì)于一個(gè)分布式的項(xiàng)目呢?又應(yīng)該如何處理。知道ORM的朋友應(yīng)該都知道IBatis.net 和NHibnate ,I家的參數(shù)處理是非常的方便的,N家呢就沒有I的直觀,但是對(duì)于面向?qū)ο蟮奶幚鞩比N家好像就有太多的不足了。對(duì)于遠(yuǎn)程處理要能夠通過參數(shù)傳遞這些只對(duì)映射層公開的參數(shù),這點(diǎn)對(duì)于程序的某些地方可能是至關(guān)重要的影響。我的ORM里面,隨便起了一個(gè)名字,叫通用查詢,業(yè)務(wù)邏輯里用的查詢通常會(huì)寫在存儲(chǔ)過程里,可以通過工具直接生成業(yè)務(wù)層代碼里的函數(shù)。

LINQ To SQL和ORM的理解7、對(duì)于泛形、繼承的支持與處理。

泛形,可以減少很多代碼,同時(shí),還可以減少很多人為的錯(cuò)誤。

因?yàn)槿说木偸怯邢薜模惆丫ㄔ谝粋€(gè)地方,那么其他方面肯定關(guān)注的少了,我也一樣。可能是我把精力過多的放在我的ORM里面,忽略了其他的方面,請(qǐng)大家能夠給出批評(píng)指正。接下來,把我的ORM映射部分做一詳細(xì)的介紹

LINQ To SQL和ORM的理解之ORM映射主要分為以下幾個(gè)方面:

LINQ To SQL和ORM的理解1、對(duì)象、參數(shù)翻譯

a)LINQ To SQL和ORM的理解之對(duì)象的表達(dá)。對(duì)象的映射,我采用的是自定義屬性方法。

  1. namespace LG.Common.Enities  
  2. {  
  3. using System;  
  4. using System.Collections.Generic;  
  5. using System.Text;  
  6. using System.Data;  
  7. using System.Data.SqlClient;  
  8. using Unie2e.Common;  
  9. using Unie2e.ORM;  
  10. using Unie2e.ORM.Mapping;  
  11. [System.SerializableAttribute()]  
  12. [Unie2e.ORM.Mapping.TableAttribute(  
  13. "City", MapFileName="CityCustParam.Xml")]  
  14. public sealed class CityEntity :   
  15. Unie2e.ORM.Mapping.Entity  
  16. {  
  17. /**//// <summary>  
  18. /// 映射字段的總長(zhǎng)度  
  19. /// </summary>  
  20. private const int length = 5; 
#p#

LINQ To SQL和ORM的理解之映射字段

  1. #region 映射字段  
  2.  
  3. /**//// <summary>  
  4.  
  5. /// 城市Id  
  6.  
  7. /// </summary>  
  8.  
  9. [Unie2e.ORM.Mapping.FieldAttribute(  
  10. "City""CityId"true, SqlDbType.  
  11. UniqueIdentifier, 0, 0, 0, "城市Id")]  
  12.  
  13. public Guid CityId = System.Guid.NewGuid();  
  14.  
  15. /**//// <summary>  
  16.  
  17. /// 省份Id  
  18.  
  19. /// </summary>  
  20.  
  21. [Unie2e.ORM.Mapping.FieldAttribute("City",   
  22. "ProvinceId"false, SqlDbType.UniqueIdentifier,  
  23.  0, 0, 0, "省份Id")]  
  24.  
  25. public Guid ProvinceId = System.Guid.Empty;  
  26.  
  27. /**//// <summary>  
  28.  
  29. /// 城市代碼  
  30.  
  31. /// </summary>  
  32.  
  33. [Unie2e.ORM.Mapping.FieldAttribute("City",  
  34. "CityCode"false, SqlDbType.VarChar,  
  35.  50, 0, 0, "城市代碼")]  
  36.  
  37. public String CityCode;  
  38.  
  39. /**//// <summary>  
  40.  
  41. /// 城市名稱  
  42.  
  43. /// </summary>  
  44.  
  45. [Unie2e.ORM.Mapping.FieldAttribute("City",   
  46. "CityName"false, SqlDbType.VarChar,   
  47. 50, 0, 0, "城市名稱")]  
  48.  
  49. public String CityName;  
  50.  
  51. /**//// <summary>  
  52.  
  53. /// 備注  
  54.  
  55. /// </summary>  
  56.  
  57. [Unie2e.ORM.Mapping.FieldAttribute("City",   
  58. "CityComment"false, SqlDbType.VarChar,   
  59. 200, 0, 0, "備注")]  
  60.  
  61. public String CityComment;  
  62.  
  63. #endregion  

LINQ To SQL和ORM的理解之重載基類函數(shù)

  1. public override void Initialize(object[] parameters)  
  2.  
  3. {  
  4.  
  5. if ((length != parameters.Length))  
  6. {  
  7. throw new E2EException("參數(shù)個(gè)數(shù)與字段數(shù)不相等");  
  8. }  
  9. CityId = ((System.Guid)(parameters[0]));  
  10. ProvinceId = ((System.Guid)(parameters[1]));  
  11. CityCode = ((string)(parameters[2]));  
  12. CityName = ((string)(parameters[3]));  
  13. CityComment = ((string)(parameters[4]));  
  14. }  
  15. public override object[] ToArray()  
  16. {  
  17. object[] objs = new object[5];  
  18. objs[0] = CityId;  
  19. objs[1] = ProvinceId;  
  20. objs[2] = CityCode;  
  21. objs[3] = CityName;  
  22. objs[4] = CityComment;  
  23. return objs;  
  24. }  
  25. #endregion  
  26. }  
  27. [System.SerializableAttribute()]  
  28. [Unie2e.ORM.Mapping.TableAttribute("City")]  
  29. public abstract class CityFindParam<T> : EntityParam<T> where T: IEntity  
  30. {  
  31. /**//// <summary>  
  32.  
  33. /// 映射字段的總長(zhǎng)度  
  34. /// </summary>  
  35. private const int length = 6;  

LINQ To SQL和ORM的理解之映射字段

  1. [Unie2e.ORM.Mapping.FieldAttribute(  
  2. "City""Method", SqlDbType.VarChar, 50, 0, 0, "")]  
  3.  
  4. public String Method;  
  5.  
  6. [Unie2e.ORM.Mapping.FieldAttribute("City",   
  7. "CityId", SqlDbType.UniqueIdentifier, 0, 0, 0, "")]  
  8.  
  9. public Guid CityId = System.Guid.Empty;  
  10.  
  11. [Unie2e.ORM.Mapping.FieldAttribute("City",  
  12.  "ProvinceId", SqlDbType.UniqueIdentifier, 0, 0, 0, "")]  
  13.  
  14. public Guid ProvinceId = System.Guid.Empty;  
  15.  
  16. [Unie2e.ORM.Mapping.FieldAttribute("City",   
  17. "CityCode", SqlDbType.VarChar, 50, 0, 0, "")]  
  18.  
  19. public String CityCode;  
  20.  
  21. [Unie2e.ORM.Mapping.FieldAttribute("City",  
  22.  "CityName", SqlDbType.VarChar, 50, 0, 0, "")]  
  23.  
  24. public String CityName;  
  25.  
  26. [Unie2e.ORM.Mapping.FieldAttribute("City",   
  27. "CityComment", SqlDbType.VarChar, 200, 0, 0, "")]  
  28.  
  29. public String CityComment;  
  30.  
  31. #endregion  

LINQ To SQL和ORM的理解之重載基類函數(shù)

  1. public override object[] ToArray()  
  2. {  
  3. object[] objs = new object[6];  
  4. objs[0] = Method;  
  5. objs[1] = CityId;  
  6. objs[2] = ProvinceId;  
  7. objs[3] = CityCode;  
  8. objs[4] = CityName;  
  9. objs[5] = CityComment;  
  10. return objs;  
  11. }  
  12. public override void Initialize(object[] parameters)  
  13. {  
  14. if ((length != parameters.Length))  
  15. {  
  16. throw new E2EException("參數(shù)個(gè)數(shù)與字段數(shù)不相等");  
  17. }  
  18. Method = ((String)(parameters[0]));  
  19. CityId = ((Guid)(parameters[1]));  
  20. ProvinceId = ((Guid)(parameters[2]));  
  21. CityCode = ((String)(parameters[3]));  
  22. CityName = ((String)(parameters[4]));  
  23. CityComment = ((String)(parameters[5]));  
  24. }  
  25. #endregion  
  26. }  
  27. [System.SerializableAttribute()]  
  28. [Unie2e.ORM.Mapping.TableAttribute("City")]  
  29. public sealed class CityFindParam : CityFindParam<CityEntity>  
  30. {  
  31. }  
  32. [System.SerializableAttribute()]  
  33. [Unie2e.ORM.Mapping.TableAttribute("City")]  
  34. public abstract class CityActionParam<T> :   
  35. EntityParam<T> where T: IEntity  
  36.  
  37. {  
  38.  
  39. /**//// <summary>  
  40. /// 映射字段的總長(zhǎng)度  
  41. /// </summary>  
  42. private const int length = 2;  
  43. 映射字段#region 映射字段  
  44. [Unie2e.ORM.Mapping.FieldAttribute("City",   
  45. "Method", SqlDbType.VarChar, 50, 0, 0, "")]  
  46. public String Method;  
  47. [Unie2e.ORM.Mapping.FieldAttribute("City",   
  48. "CityId", SqlDbType.UniqueIdentifier, 0, 0, 0, "")]  
  49. public Guid CityId = System.Guid.Empty;  
  50. #endregion  

#p#

LINQ To SQL和ORM的理解之重載基類函數(shù)

  1. public override object[] ToArray()  
  2. {  
  3. object[] objs = new object[2];  
  4. objs[0] = Method;  
  5. objs[1] = CityId;  
  6. return objs;  
  7. }  
  8. public override void Initialize(object[] parameters)  
  9. {  
  10. if ((length != parameters.Length))  
  11. {  
  12. throw new E2EException("參數(shù)個(gè)數(shù)與字段數(shù)不相等");  
  13. }  
  14. Method = ((String)(parameters[0]));  
  15. CityId = ((Guid)(parameters[1]));  
  16. }  
  17. #endregion  
  18. }  
  19.  
  20. [System.SerializableAttribute()]  
  21. [Unie2e.ORM.Mapping.TableAttribute("City")]  
  22. public sealed class CityActionParam :   
  23. CityActionParam<CityEntity>  
  24. {  
  25. }  
  26. }  
  27.  
  28. [Unie2e.ORM.Mapping.TableAttribute("City",   
  29. MapFileName="CityCustParam.Xml")]  

給出了映射對(duì)象與數(shù)據(jù)庫(kù)表或者視圖的關(guān)系,MapFileName給出了所對(duì)應(yīng)的通用查詢的配置文件,當(dāng)然也可以把Sql語(yǔ)句寫在配置文件里面,實(shí)現(xiàn)查詢之外的其他動(dòng)作處理。因?yàn)楣ぞ邲]有對(duì)其他生成代碼函數(shù)的支持,所以通常還是通過工具來生成存儲(chǔ)過程來處理。

在Entity里面,有兩上重載的函數(shù):public override void Initialize(object[] parameters)和public override object[] ToArray(),這兩個(gè)函數(shù)是為了加速數(shù)據(jù)加載的。底層用的是DataReader讀取數(shù)據(jù),盡可能少的通過反射加載數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)的快速?gòu)臄?shù)據(jù)庫(kù)加載到對(duì)象里面,因?yàn)檫@些代碼都是通過工具生成的,不會(huì)出現(xiàn)錯(cuò)誤,比較要注意的是用工具寫存儲(chǔ)過程的時(shí)候要注意一點(diǎn)就可以了。

  1. [Unie2e.ORM.Mapping.FieldAttribute("City""CityId",   
  2.  
  3. true, SqlDbType.UniqueIdentifier, 0, 0, 0, "城市Id")]  

給出了對(duì)象Field與表或視圖的列的映射關(guān)系。***一個(gè)是對(duì)于注釋,對(duì)于BO的業(yè)務(wù)數(shù)據(jù)會(huì)生成Summary。最終會(huì)生成到界面的表述,以及列表的配置文件的頭。

除了Entity 外,還有CityFindParam<T> ,CityFindParam,CityActionParam<T>,CityActionParam這幾個(gè)類,CityFindParam<T> 主要是為了實(shí)現(xiàn)可變返回?cái)?shù)據(jù),默認(rèn)情況下返回的是完整表的數(shù)據(jù),有時(shí)候,數(shù)據(jù)庫(kù)表或視圖的字段很多,比較重要的地方,可能只會(huì)要求返回其中的部分字段,用在這方面處理。CityActionParam,主要是針對(duì)批量更新等特殊處理,對(duì)個(gè)別地方進(jìn)行性能優(yōu)化處理。

b)LINQ To SQL和ORM的理解之對(duì)象翻譯

對(duì)象翻譯就是把對(duì)象屬性翻譯到成相對(duì)應(yīng)的存儲(chǔ)過程的調(diào)用。我的ORM映射主要是對(duì)象參數(shù)處理。添加、刪除、修改都是對(duì)完整的對(duì)象的映射,對(duì)于特別的處理是通過Action處理的。

  1. SqlParameter[] BuilderSqlParameters(Type type,SQLActionType actionType)  
  2. {  
  3. FieldInfo[] infos = type.GetFields();  
  4. SqlParameter[] parameters =   
  5. new SqlParameter[infos.Length];  
  6. for (int i = 0; i < infos.Length; i++)  
  7. {  
  8. object[] objs = infos[i].GetCustomAttributes(typeof(FieldAttribute), false);  
  9. FieldAttribute attr = objs[0] as FieldAttribute;  
  10. SqlParameter sp;  
  11. if (attr.Length != 0)  
  12. sp = new SqlParameter("@" + attr.ColumnName, attr.SqlDbType, attr.Length);  
  13. else 
  14.  {  
  15.  sp = new SqlParameter("@" + attr.ColumnName, attr.SqlDbType);  
  16.  }  
  17.  if (attr.IsKey&&actionType== SQLActionType .Insert)  
  18.  sp.Direction = ParameterDirection.InputOutput;  
  19.  parameters[i]=sp;  
  20. }  
  21. }  
  22. return parameters;  

***次執(zhí)行的時(shí)候,遍歷所有字段,根據(jù)FieldAttribute 生成調(diào)用存儲(chǔ)過程的Command,并緩存,第二次執(zhí)行的時(shí)候,直接從緩存里取出Command 的Clone()。此處調(diào)用Clone ,返回的是Command的DeepCopy!!!也是微軟在2.0里面新添加的函數(shù),我估計(jì)新加的函數(shù)的用處也就是在這里了,極大的提高了處理速度。接下來就是存儲(chǔ)過程的賦值了。

  1. void AssignParameterValues(object instance, SqlCommand cmd)  
  2. {  
  3. SqlParameterCollection sps = cmd.Parameters;  
  4. IEntity idb =instance as IEntity;  
  5. if (idb == null)  
  6. throw new Exception("存儲(chǔ)過程賦值出錯(cuò),要具有IEntity接口");  
  7. object[] values = idb.ToArray();  
  8. if (values.Length != sps.Count )  
  9. throw new Exception("參數(shù)個(gè)數(shù)不一致");  
  10. for (int i = 0; i < values.Length; i++)  
  11. {  
  12. object val = values[i];  
  13. //對(duì)于時(shí)間的空值等,這里還會(huì)報(bào)錯(cuò)。一般要求要有初始化。  
  14. sps[i].Value =null == val ?System.DBNull.Value:val;  
  15. }  

剛剛介紹了在Entity和ParamEntity里面有兩個(gè)重載的虛函數(shù)函數(shù),其中一個(gè)是:ToArray(),在這里用到了。如果是通過反射得到實(shí)例的值,那效率實(shí)在是太低了,這里用了IEntity的ToArray(),因?yàn)橛成涞捻樞蛭恢枚际枪潭ǖ模钥梢酝ㄟ^數(shù)組的方式實(shí)現(xiàn)。這也是工具的重要的地方,靠手工處理,錯(cuò)誤的幾率太高了。

現(xiàn)在存儲(chǔ)過程是可以正常調(diào)用了,正常的 增、改、刪,是可以處理了,下面介紹取數(shù)據(jù)。

#p#

c)LINQ To SQL和ORM的理解之?dāng)?shù)據(jù)讀取加載

數(shù)據(jù)加載主要是通過DataReader實(shí)現(xiàn)的。

  1. object GetFindResult(IDataReader reader, Type targetType)  
  2. {  
  3. Type target = targetType;  
  4. object[] fields = new object[reader.FieldCount];  
  5. IEntity t = (IEntity)Activator.CreateInstance(target);  
  6. Type constructed = typeof(ORMCollection<>).  
  7. MakeGenericType(target);  
  8. IList list = (IList)Activator.CreateInstance(constructed);  
  9. while (reader.Read())  
  10. {  
  11. for (int i = 0; i < fields.Length; i++)  
  12. {  
  13.  fields[i] = reader.IsDBNull(i) ? null : reader[i];  
  14. }  
  15. t.Initialize(fields);  
  16. list.Add(t.Clone());  
  17. }  
  18. return list;  
  19. }  
  20. object GetFindResult(IDataReader reader,  
  21.  Type targetType, int currentpage, int pagesize) 

數(shù)據(jù)加載提供了2個(gè)函數(shù),一個(gè)是帶分頁(yè)一個(gè)是不帶分頁(yè)。IEntity提供的幾個(gè)接口在這里都用了,也主要是為了這里準(zhǔn)備的。也主要是在此實(shí)現(xiàn)了數(shù)據(jù)的快速加載。主要體現(xiàn)在兩個(gè)上面,一個(gè)是t.Initialize(fields),Initialize 在上面是介紹了,不用通過反射初始化及賦值,再者是 t.Clone(),用的也是DeepCopy,不是用Activator 創(chuàng)建新的對(duì)象實(shí)例,因?yàn)锳ctivator 構(gòu)造對(duì)象的時(shí)候速度跟DeepCopy相比,要慢了很多。

還有一個(gè)是我自封的通用查詢,也就是通過MapFileName 找到配置文件,把Sql配置文件加載進(jìn)來,翻譯成Command加到緩存里面,后期的處理與上面的一樣,在這里就不再過多的介紹了,只把關(guān)鍵代碼列出來。

  1. string BuildFind(FieldInfo[] pis, FinderParam finderParam,  
  2.  out SqlParameter[] parameters)  
  3. {  
  4. ORMCollection<FinderParamItem> items =   
  5. finderParam.ParamItemCollection;  
  6. if (items==null)  
  7.  
  8. throw new E2EException("ParamItemCollection參數(shù)不能為空");  
  9. StringBuilder sb = new StringBuilder();  
  10. List<SqlParameter> parameterList = new List<SqlParameter>();  
  11. foreach (FinderParamItem var in items)  
  12. {  
  13. FieldInfo pi = Array.Find(pis, delegate(FieldInfo obj) {   
  14. return obj.Name.Equals(var.PropertyName,  
  15.  StringComparison.OrdinalIgnoreCase); });  
  16.  
  17. if (pi == null)  
  18.  
  19.  throw new E2EException("不存在參數(shù):"+var.PropertyName);   
  20.  
  21. object[] attribs = pi.GetCustomAttributes(  
  22. typeof(FieldAttribute), false);  
  23.  
  24. if (attribs.Length == 0)  
  25. continue;  
  26. FieldAttribute attr = attribs[0] as FieldAttribute;  
  27. string typeName = pi.FieldType.Name;  
  28. if (sb.Length != 0)  
  29. {  
  30. switch (var.JoinKey)  
  31. {  
  32. case JoinKey.與:  
  33.  sb.Append(" AND ");  
  34.  break;  
  35.  case JoinKey.或:  
  36.  sb.Append(" OR ");  
  37.  break;  
  38.  default:  
  39.  break;  
  40.  }  
  41. }  
  42. sb.Append(" (");  
  43.  
  44. sb.Append(attr.TableName+"."+attr.ColumnName);  
  45.  
  46. switch (var.ComparisonKey)  
  47.  
  48. {  
  49.  case ComparisonKey.等于:  
  50.  sb.Append("=");  
  51.  break;  
  52.  case ComparisonKey.不等于:  
  53.  sb.Append("<>");  
  54.  break;  
  55.  case ComparisonKey.大于:  
  56.  sb.Append(">");  
  57.  break;  
  58.  case ComparisonKey.小于:  
  59.  sb.Append("<");  
  60.  break;  
  61.  case ComparisonKey.大于等于:  
  62.  sb.Append(">=");  
  63.  break;  
  64.  case ComparisonKey.小于等于:  
  65.  sb.Append("<=");  
  66.  break;  
  67.  case ComparisonKey.包含:  
  68.  sb.Append(" like ");  
  69.  break;  
  70.  case ComparisonKey.不含:  
  71.  sb.Append("<>");  
  72.  break;  
  73.  default:  
  74.  break;  
  75. }  
  76.  
  77. sb.Append("@" + pi.Name + ")");  
  78. SqlParameter param = new SqlParameter();  
  79. param.ParameterName = "@" + pi.Name;  
  80. param.SqlDbType = attr.SqlDbType;  
  81. param.Size = attr.Length;  
  82. param.Scale = (byte)attr.XScale;  
  83. param.Precision = (byte)attr.XPrec;  
  84. param.IsNullable = true;  
  85. parameterList.Add(param);  
  86. sb.Append(" ");  
  87. }  
  88. if (sb.Length > 0)  
  89. sb.Insert(0, " WHERE ");  
  90. parameters = parameterList.ToArray();  
  91. return sb.ToString();  
  92. }  

到此,基本ORM 映射的處理已經(jīng)介紹完了,映射的代碼都是通過工具生成的,不用人工去處理,曾考慮直接生成Dll的,包括存儲(chǔ)過程,都是工具與之配套的,至少不用寫千篇一率的Insert、Update、Delete、FindById這些枯燥的存儲(chǔ)過程了,如果是通過外鍵關(guān)聯(lián)的,相關(guān)的存儲(chǔ)過程也是自動(dòng)生成的,盡可能減少人工處理過程。(建立的時(shí)候可以把外鍵全部進(jìn)來,代碼生成完之后,再把外鍵去掉,偷工減料的做法,偶經(jīng)常做 ^_^)

當(dāng)然,這里只是ORM 處理,還沒有把業(yè)務(wù)邏輯層關(guān)聯(lián)起來,大家最關(guān)注的還是業(yè)務(wù)邏輯處理,這才是核心,我只所以不想更換ORM,部分是由于我的邏輯層的組織。

原文來自:http://www.cnblogs.com/dreamstec/archive/2008/02/06/1065343.html

關(guān)于LINQ To SQL和ORM的理解的相關(guān)內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)LINQ To SQL和ORM的理解有所幫助。

【編輯推薦】

  1. LINQ刪除記錄實(shí)戰(zhàn)解析
  2. 淺析LINQ嵌套的實(shí)現(xiàn)過程
  3. LINQ嵌套實(shí)戰(zhàn)案例分析
  4. LINQ模糊查詢應(yīng)用實(shí)例分析
  5. LINQ模糊查詢學(xué)習(xí)體驗(yàn)淺析
責(zé)任編輯:仲衡 來源: 博客園
相關(guān)推薦

2009-09-17 17:34:23

linq to sql

2009-09-16 17:11:35

LINQ To SQL

2009-09-10 18:02:23

LINQ to SQL

2009-09-14 09:46:00

LINQ to SQL

2009-09-17 18:05:15

linq to sql

2009-09-15 10:12:37

LINQ To SQL

2009-09-10 10:09:46

LINQ to SQL

2009-09-14 14:20:36

LINQ ORM

2009-09-18 14:25:36

LINQ to SQL

2009-09-14 19:20:22

LINQ TO SQL

2009-09-15 14:30:11

Linq連接

2009-06-15 17:32:09

LINQ更新數(shù)據(jù)

2009-09-14 18:57:19

LINQ查詢

2009-09-22 13:09:06

Hibernateorm框架

2009-09-17 13:30:32

LINQ to XML

2009-09-15 13:30:54

linq級(jí)聯(lián)

2009-09-16 15:33:22

LINQ to XML

2009-09-07 16:44:28

Linq String

2009-09-14 16:46:15

LINQ to XML

2009-09-18 14:33:37

LINQ to SQLSQL命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲成人一品| 亚洲深夜视频| 成人性色生活片| 欧美一区在线直播| 欧美88888| 麻豆一二三区精品蜜桃| 欧美日韩中文在线| 亚洲一区二区三区乱码| av老司机久久| 久久久久久久波多野高潮日日| 色噜噜狠狠狠综合曰曰曰| 极品白嫩少妇无套内谢| 色老太综合网| 洋洋成人永久网站入口| 日本在线视频一区| www.蜜臀av.com| 日本欧美韩国一区三区| 欧美精品www在线观看| 受虐m奴xxx在线观看| 亚洲一区二区三区日本久久九| 精品久久久久久久大神国产| 国产一二三四五| 毛片在线免费| 成人在线一区二区三区| 国产精品永久免费在线| 成人免费看片98| 国产高清一区| 亚洲一区二区福利| 中文文字幕文字幕高清| www 久久久| 欧美色图12p| 精品无码一区二区三区在线| 成人区精品一区二区不卡| 国产视频亚洲色图| 久久久久久艹| 免费观看黄一级视频| 国产一区二区久久| 国产剧情久久久久久| 91午夜精品亚洲一区二区三区| 在线成人www免费观看视频| 久久视频在线观看免费| 中文字幕91视频| 日韩一区三区| 中文字幕日韩精品在线| 老熟妇一区二区| 米奇777超碰欧美日韩亚洲| 亚洲激情第一页| 青青草视频网站| 国产欧美自拍一区| 亚洲精品在线观看视频| 韩国三级在线看| 成人看片黄a免费看视频| 欧美变态口味重另类| 波多野结衣电影免费观看| 国产精品日本一区二区不卡视频| 欧美日韩1234| 日韩av片免费观看| 成人免费91| 欧美一区二区网站| 永久免费看片在线观看| 一区中文字幕电影| 欧美精品一区二区三区蜜桃| 亚洲一级Av无码毛片久久精品| www.国产精品一区| 亚洲第一网中文字幕| 天堂www中文在线资源| 欧美1区2区3区4区| 亚洲男人天堂古典| 国产精品久久久久久成人| 欧美大片aaaa| 欧美精品在线免费播放| 亚洲国产精品午夜在线观看| 99riav1国产精品视频| 欧美整片在线观看| 性高潮视频在线观看| 美女在线观看视频一区二区| 亚洲free嫩bbb| 欧美一级视频免费| 久久久久国产精品人| 亚洲欧洲国产精品久久| 91麻豆一二三四在线| 亚洲va天堂va国产va久| 蜜臀av午夜一区二区三区| 在线日本欧美| 日韩一区二区三区视频在线观看| 欧美日韩一区二区区别是什么 | 国产精品久久久久久久久免费| 国产一级片免费视频| 久久aⅴ国产欧美74aaa| 高清日韩一区| 香蕉久久一区二区三区| 欧美国产精品中文字幕| 国产免费xxx| 在线成人av观看| 91精品国产综合久久久久久| 精品国产一区在线| 99精品视频在线观看播放| 欧美精品18videos性欧| 在线观看av大片| 成人午夜av电影| 亚洲国产一区二区在线| 黄网av在线| 欧美性色黄大片| 中国特级黄色大片| 久久久影院免费| 91av在线播放| 国产偷拍一区二区| 久久精品人人爽人人爽| 99视频精品全部免费看| 二吊插入一穴一区二区| 日韩三级免费观看| 国产免费无遮挡吸奶头视频| 欧美日韩成人| 国产精品一区专区欧美日韩| 天堂在线中文资源| 一区二区三区在线观看网站| 丝袜制服一区二区三区| 久久这里只有精品一区二区| 久久久国产精品亚洲一区| 日韩精品一区二区亚洲av| 日本最新在线视频| 亚洲人成在线播放网站岛国| 那种视频在线观看| 视频亚洲一区二区| 视频在线观看一区二区| 国产成人综合欧美精品久久| 国产精品一区二区在线看| 日本一区二区在线视频观看| 白白色在线观看| 在线不卡中文字幕| 黑人と日本人の交わりビデオ| 99精品热视频只有精品10| 92看片淫黄大片看国产片| 国产高清自拍视频在线观看| 精品久久久久久久久国产字幕 | 亚洲电影有码| 日韩av中文字幕在线| xxxx 国产| 国产宾馆实践打屁股91| 法国空姐在线观看免费| 亚洲精品无播放器在线播放| 国产一区av在线| 日本熟女毛茸茸| 91丨九色丨国产丨porny| 成人在线视频一区二区三区| 成人影院网站ww555久久精品| 中文字幕欧美精品在线| 免费av中文字幕| 国产日韩成人精品| 日本黄色三级大片| 欧美猛男男男激情videos| 日本一区二区三区四区视频| 日本一区视频| 欧美性极品xxxx娇小| 黄瓜视频污在线观看| 中文亚洲字幕| 欧美黄色直播| 成人日韩在线| 中文欧美在线视频| 91tv国产成人福利| 亚洲欧美日韩国产一区二区三区 | 久久av高潮av| 91精品短视频| 性色av一区二区三区红粉影视| 黄色a在线观看| 亚洲大片免费看| 三级黄色片网站| 首页欧美精品中文字幕| 视频在线精品一区| 91国产一区| 欧美大片大片在线播放| 三级网站在线看| 欧美天天综合色影久久精品| 男人天堂av电影| 麻豆成人久久精品二区三区小说| 色乱码一区二区三区熟女 | 欧美一激情一区二区三区| 日韩在线中文字幕视频| 国产成人精品一区二区三区网站观看| 欧美极品少妇无套实战| 麻豆一区二区麻豆免费观看| 国产精品1234| 毛片在线播放a| 精品国产制服丝袜高跟| 黑人精品无码一区二区三区AV| 国产欧美日韩久久| 亚洲精品乱码久久久久久9色| 亚洲国产91| 欧美在线一区二区三区四区| 亚洲青青一区| 777精品视频| 91女主播在线观看| 欧美成人精品1314www| 日本中文字幕在线| 综合色天天鬼久久鬼色| 中文乱码人妻一区二区三区视频| 日韩av网站免费在线| 少妇高潮大叫好爽喷水| 三级小说欧洲区亚洲区| 成人免费网站在线看| 超碰在线99| www国产精品com| 亚洲 欧美 自拍偷拍| 欧美精品高清视频| 日本午夜视频在线观看| 亚洲天堂免费看| 精品无码一区二区三区| 国产999精品久久久久久| 国产成人精品无码播放| 欧美喷水视频| 性欧美.com| 香蕉久久精品日日躁夜夜躁| 91九色单男在线观看| 高潮一区二区| 久久久免费在线观看| 在线视频自拍| 亚洲欧洲激情在线| 免费观看a视频| 欧美一级理论性理论a| 欧美男人天堂网| 香港成人在线视频| 永久免费看黄网站| 国产精品全国免费观看高清| 国产伦精品一区二区三区妓女| 国产乱码字幕精品高清av | 日韩福利影视| 国产精品69av| 亚洲国产欧美日本视频| 国模精品一区二区三区色天香| 黄色网址视频在线观看| 这里精品视频免费| 免费理论片在线观看播放老| 精品88久久久久88久久久| 精品国产九九九| 欧美人狂配大交3d怪物一区| 超碰在线97观看| 一本大道久久精品懂色aⅴ| 国产 欧美 日韩 在线| 一区二区在线观看av| 成人在线观看小视频| 国产精品久久久久久亚洲伦| 蜜桃久久精品成人无码av| 久久综合五月天婷婷伊人| 欧美日韩人妻精品一区在线| 成人精品免费看| 熟妇高潮一区二区| 成人高清视频免费观看| 黄色av电影网站| 成人久久久精品乱码一区二区三区| 手机在线播放av| 国产成人av影院| 国产av一区二区三区传媒| 福利电影一区二区三区| 无码人妻一区二区三区精品视频| 国产激情偷乱视频一区二区三区| 九色91porny| 国产精品一区二区男女羞羞无遮挡 | 777xxx欧美| 国产女人18毛片18精品| 日韩视频在线观看一区二区| www香蕉视频| 亚洲激情 国产| 成人午夜影视| 久久天天躁狠狠躁夜夜躁2014 | 欧美精品尤物在线观看| 日韩精品欧美在线| 欧美岛国激情| 国产传媒久久久| 99精品热6080yy久久| 日韩一级在线免费观看| 麻豆精品一二三| 91网址在线观看精品| 国产成人av电影免费在线观看| 国产一级黄色录像| 欧美极品xxx| 欧美精品一级片| 狠狠爱在线视频一区| 国语对白做受69按摩| 91精品婷婷国产综合久久竹菊| 国产浮力第一页| 精品视频—区二区三区免费| 成人福利在线| 欧美美最猛性xxxxxx| 国产乱码午夜在线视频| 国产高清视频一区三区| 国内精品视频| 国内精品**久久毛片app| 国产精品亚洲人成在99www| 婷婷久久五月天| 亚洲综合小说| 免费在线激情视频| 狠狠色丁香九九婷婷综合五月| 国产午夜在线一区二区三区| 国产精品久久久久三级| 国产精品第72页| 欧美性猛交一区二区三区精品| av网站免费播放| 亚洲天堂成人在线| 亚洲精品天堂| 国产成人综合亚洲| 国产精品久久久网站| 亚洲国产欧美日韩| 国产亚洲精品久久久久婷婷瑜伽| 久久撸在线视频| 91丨porny丨在线| 久久久久久久久毛片| 欧美在线看片a免费观看| 亚洲成人一级片| 日韩一区在线视频| 成人勉费视频| 国产高清一区二区三区| 久久一区二区三区喷水| 2022亚洲天堂| 国产高清不卡二三区| 日本黄区免费视频观看| 欧美视频在线视频| 好吊色一区二区| 久久久精品久久| 精品网站在线| 精品一区二区视频| 好吊日精品视频| 日日干日日操日日射| 久久精品亚洲乱码伦伦中文| 日韩激情在线播放| 日韩情涩欧美日韩视频| 尤物网址在线观看| 国产成人在线一区| 伊甸园亚洲一区| 国产极品尤物在线| 成人一区二区三区中文字幕| 国产精品免费在线视频| 欧美综合视频在线观看| 日韩欧美亚洲系列| 久久久视频精品| 爱高潮www亚洲精品| 91精品一区二区三区四区| 韩国一区二区在线观看| 日韩精品久久久久久久的张开腿让| 欧美丝袜一区二区| 欧洲天堂在线观看| 欧美一级大片在线观看| 欧美日韩大片免费观看| 缅甸午夜性猛交xxxx| av亚洲精华国产精华| 国产在线视频二区| 亚洲第一网中文字幕| 精精国产xxxx视频在线野外 | 天天操精品视频| 亚洲婷婷综合色高清在线| 一级特黄色大片| 精品国产一区二区三区久久狼黑人| 99只有精品| 一区二区精品在线| 精东粉嫩av免费一区二区三区| 亚洲综合图片一区| 正在播放亚洲一区| 成人福利网站| 99久久精品无码一区二区毛片 | 中文字幕在线播放不卡一区| 亚洲一卡二卡在线| 久久精品成人欧美大片古装| 国产精品免费精品自在线观看| 蜜桃视频成人在线观看| 国产成人精品午夜视频免费 | 欧美色区777第一页| 天堂аⅴ在线地址8| 91精品网站| 亚洲美女一区| 国产精品密蕾丝袜| 欧美日韩国产另类一区| 免费黄色在线观看| 不卡一卡2卡3卡4卡精品在| 亚洲精品女人| 99久久精品免费视频| 91精品在线免费观看| 黄色视屏在线免费观看| 亚欧洲精品在线视频免费观看| 狠狠久久亚洲欧美| 日日夜夜综合网| 中文字幕日本欧美| 成人精品动漫一区二区三区| 日本在线观看a| 自拍偷拍亚洲激情| 亚洲 欧美 精品| 国产中文欧美精品| 亚洲成人资源| 精品人妻无码一区| 欧美一区日韩一区| 新版的欧美在线视频| 一个色的综合| 9久草视频在线视频精品| 精品乱码一区内射人妻无码| 九九精品在线播放| 国内黄色精品| 亚洲精品一区二区18漫画 | www.五月婷| 日韩av片永久免费网站| 亚洲欧洲美洲一区二区三区| 成人免费网站黄| 日韩精品中文字幕一区二区三区|