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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
學(xué)習(xí)筆記Linqtosql動態(tài)查詢

本文從四個(gè)方面對Linq to sql動態(tài)查詢進(jìn)行了闡述,這其中既有原理,又有實(shí)例,是大家休學(xué)習(xí)Linq to sql動態(tài)查詢的好資料。

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、網(wǎng)站制作、沾益網(wǎng)絡(luò)推廣、小程序開發(fā)、沾益網(wǎng)絡(luò)營銷、沾益企業(yè)策劃、沾益品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供沾益建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com

動態(tài)的生成sql語句,根據(jù)不同的條件構(gòu)造不同的where字句,是拼接sql 字符串的好處。而Linq的推出,是為了彌補(bǔ)編程中的 Data != Object 的問題。我們又該如何實(shí)現(xiàn)用object的Linq to sql動態(tài)查詢呢?

1,Linq to sql動態(tài)查詢之用object的查詢是什么?

我們可以簡單的舉這么一個(gè)例子。我們到公安局查找一個(gè)人。首先,我們會給出他的一些特征,比如,身高多少,年齡多少,性別,民族等。那么,我們把這個(gè)人的一些特征輸入電腦。我們希望,電腦能給我們返回這個(gè)人的信息。

而實(shí)際上,有相同特征的人太多了,常常返回一個(gè)集合。那讓我們把這個(gè)過程抽象到程式里。我們需要new出來一個(gè)對象。這個(gè)對象包含了我們能知道的基本信息。而后,把這個(gè)對象傳給Linq To Sql,等待返回結(jié)果。

根據(jù)這些基本的需求,我們來定義下面的函數(shù),為了實(shí)現(xiàn)這個(gè)函數(shù)對任何實(shí)體都是有用的,我們把它定義為generic的。為了不破壞Linq To Sql延遲加載的規(guī)矩,我們把它的返回類型定義為IQueryable。如下:

public IQueryable Find (TEntity obj) where TEntity : class

思路出來了,先new出來一個(gè)對象,然后把對象傳給這個(gè)函數(shù),我們渴望它能返回與這個(gè)對象匹配的結(jié)果集。為了讓它和DataContext有關(guān)系,我們把這個(gè)函數(shù)放到DataContext的partial類里。

鼠標(biāo)右擊Linq To Sql文件,選擇view code,這個(gè)時(shí)候,vs會為你創(chuàng)造一個(gè)DataContext的partial類,其擴(kuò)展名比影射文件少了中間的desiger。大家要注意,你如果想自己修改影射文件,請放到這個(gè)文件里。這樣當(dāng)影射code被刷新時(shí),才不會沖掉你自己的修改。先大體描述下我們的思路。

 
 
 
  1. NorthwindDataContext db = new NorthwindDataContext();
  2. //先new出一個(gè)對象
  3. Customer c = new Customer();
  4. //添入我們知道的最基本的信息,可以從ui獲得
  5. c.City = "London";
  6. c.Phone = "23236133";
  7. //call函數(shù)find返回結(jié)果
  8. var q = db.Find(c);

2,Linq to sql動態(tài)查詢之原理

Linq To Sql動態(tài)查詢支持用戶動態(tài)生成lambda表達(dá)式。本文中所實(shí)現(xiàn)的方法,正是反射加lambda動態(tài)表達(dá)式。我們先來看如何動態(tài)生成lambda表達(dá)式。

在 Linq 中,lambda表達(dá)式會首先轉(zhuǎn)化為Expression Tree,本文并不詳解Expression Tree。Expression Tree是lambda表達(dá)式從code的形式轉(zhuǎn)化為data的結(jié)果,是一種更高效的在內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)。比如:

 
 
 
  1. Func f = x => x + 1; // Code
  2. Expression> e = x => x + 1; // Data

第二個(gè),其實(shí)也就是***個(gè)轉(zhuǎn)化后的形式。那好了,有了這個(gè)前提,我們就可以動態(tài)構(gòu)造這個(gè)Expression Tree了。

 
 
 
  1. // 先構(gòu)造了一個(gè)ParameterExpression對象,這里的c,就是Lambda表達(dá)中的參數(shù)。(c=>) 
  2. ParameterExpression param = Expression.Parameter(typeof(TEntity), "c");
  3. //構(gòu)造表達(dá)式的右邊,值的一邊
  4. Expression right = Expression.Constant(p.GetValue(obj, null));
  5. //構(gòu)造表達(dá)式的左邊,property一端。
  6. Expression left = Expression.Property(param, p.Name);
  7. //生成篩選表達(dá)式。即c.CustomerID == "Tom"
  8. Expression filter = Expression.Equal(left, right);
  9. //生成完整的Lambda表達(dá)式。
  10. Expression> pred =
  11. Expression.Lambda>(filter, param);
  12. //在這里,我們使用的是and條件。
  13. queryquery = query.Where(pred);

3,Linq to sql動態(tài)查詢之反射在本方法中的作用

因?yàn)槲覀儾捎昧四0澹簿褪钦f,我們并不知道傳進(jìn)來的對象會有那些property,那反射在這里就提供一個(gè)很好的方法。我們可以通過反射去遍歷每一個(gè)property,只有判斷出該property的值不為null時(shí),才將其視為條件。該函數(shù)完整的代碼如下:

 
 
 
  1. public IQueryable Find(TEntity obj) where
  2.  TEntity : class
  3. {
  4. //獲得所有property的信息
  5. PropertyInfo[] properties =
  6. obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
  7. //構(gòu)造初始的query
  8. IQueryable query =
  9. this.GetTable().AsQueryable();
  10. //遍歷每個(gè)property
  11. foreach (PropertyInfo p in properties)
  12. {
  13. if (p != null)
  14. {
  15. Type t = p.PropertyType;
  16. //加入object,Binary,和XDocument, 支持sql_variant,imager 和xml等的影射。
  17. if (t.IsValueType || t == typeof(string) || t == typeof(System.Byte[])
  18. || t == typeof(object) || t == typeof(System.Xml.Linq.XDocument)
  19. || t == typeof(System.Data.Linq.Binary))
  20. {
  21. //如果不為null才算做條件
  22. if ( p.GetValue(obj, null) != null)
  23. {
  24. ParameterExpression param = Expression.Parameter(typeof(TEntity), "c");
  25. Expression right = Expression.Constant(p.GetValue(obj, null));
  26. Expression left = Expression.Property(param, p.Name);
  27. Expression filter = Expression.Equal(left,right);
  28. Expression> pred =
  29. Expression.Lambda>(filter, param);
  30. queryquery = query.Where(pred);
  31. }
  32. }
  33. }
  34. }
  35. return query;
  36. }

4,Linq to sql動態(tài)查詢之測試用例及反思

  我們用下面的例子來測試下這個(gè)函數(shù)

 
 
 
  1. Customer c = new Customer();
  2. c.City = "London";
  3. c.Phone = "23236133";
  4. var q = db.Find(c).ToList();

其生成的sql語句為:

 
 
 
  1. SELECT [t0].[CustomerID], [t0].[CompanyName],
  2.  [t0].[ContactName], [t0].[ContactTitle],
  3.  [t0].[Address], [t0].[City], [t0].[Region],
  4.  [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
  5. FROM [dbo].[Customers] AS [t0]
  6. WHERE ([t0].[Phone] = @p0) AND ([t0].[City] = @p1)
  7. -- @p0: Input NVarChar (Size = 8; Prec = 0; Scale = 0) [23236133]
  8. -- @p1: Input NVarChar (Size = 6; Prec = 0; Scale = 0) [London]

我們可以看到,其Linq to sql動態(tài)查詢語句中,只有city和phone兩個(gè)條件。并且他們之間是and的關(guān)系。我們最開始的設(shè)想實(shí)現(xiàn)了,但是,它是***的嗎?如果是or條件該怎么辦呢?更多的時(shí)候,我們是在用模糊查詢,那又該怎么辦呢?這個(gè)問題,就留于下篇。

***,介紹一種寫log的方法。stream流使用static為避免多個(gè)datacontext的同時(shí)在使用log.txt文件。

 
 
 
  1.   partial class DataMappingDataContext
  2. {
  3. private static StreamWriter sw =
  4. new StreamWriter(Path.Combine(Directory.GetCurrentDirectory(), "log.txt"),
  5. true);
  6. /**//// 
  7. /// Try to create DataContext with log.
  8. ///  summary>
  9. ///  param>
  10. public DataMappingDataContext(bool withLog)
  11. : this()
  12. {
  13. OnCreated();
  14. if (withLog)
  15. {
  16. if (sw == null)
  17. {
  18. sw = new StreamWriter(Path.Combine(Directory.GetCurrentDirectory(),
  19.  "log.txt"), true);
  20. }
  21. this.Log = sw;
  22. }
  23. }
  24. /**//// 
  25. /// try to close streamwriter
  26. ///  summary>
  27. ///  param>
  28.         protected override void Dispose(bool disposing)
  29. {
  30. base.Dispose(disposing);
  31. sw.Flush();
  32. }
  33. }
  34.   在dispose函數(shù)里,把輸出流flush。使用時(shí),如下
  35. using(northwind db = new norhwind(true))
  36. {
  37. //do something......
  38. }

以上就是筆者和大家分享的關(guān)于Linq to sql動態(tài)查詢的知識。


名稱欄目:學(xué)習(xí)筆記Linqtosql動態(tài)查詢
文章出自:http://m.5511xx.com/article/dhdeipc.html