<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      戀戀風(fēng)塵

      Coding is just my hobby……

      博客園 首頁(yè) 新隨筆 聯(lián)系 訂閱 管理

      一、引言

             NHibernate3.0增加了一種新的查詢(xún)API——QueryOver。QueryOver構(gòu)建在NHibernate原有的 ICriteria API之上,支持Lambda表達(dá)式與擴(kuò)展方法,可編寫(xiě)類(lèi)型安全的查詢(xún)語(yǔ)句,這樣就克服了ICriteria API字符串硬編碼的弊端。在上一篇文章中《NHibernate 3.x新功能實(shí)踐(一) QueryOver(上)》通過(guò)一個(gè)簡(jiǎn)單的實(shí)例,介紹了QueryOver進(jìn)行條件篩選(Restriction)、連接(Join)等應(yīng)用,在這篇文章中將介紹投影(Projection)、把投影結(jié)果轉(zhuǎn)成DTO、分頁(yè)、子查詢(xún)(Subquery)等常見(jiàn)應(yīng)用場(chǎng)景。 在文章《NHibernate 3.x新功能實(shí)踐(一) QueryOver(上)》最后提供實(shí)例源代碼下載。

      二、開(kāi)發(fā)環(huán)境與工具

      三、實(shí)例場(chǎng)景

            參見(jiàn)《NHibernate 3.x新功能實(shí)踐(一) QueryOver(上)

      四、查詢(xún)場(chǎng)景

      1. 投影且把投影結(jié)果轉(zhuǎn)成DTO (Projection)

       訂單DTO類(lèi):OrderDTO

       1 using System;
       2 using System.Collections.Generic;
       3 using System.Linq;
       4 using System.Text;
       5 
       6 namespace MyWorkShop.Model.DTOs
       7 {
       8     public class OrderDTO
       9     {
      10         public Guid Id { getset; }
      11         public string CustomerName getset; }
      12         public DateTime OrderedDateTime { getset; }
      13         public Decimal? Amount { getset; } 
      14     }
      15 }

       (1)根據(jù)訂單號(hào)查找訂單,并用LINQ TO Object轉(zhuǎn)成OrderDTO

       1 public OrderDTO GetOrderDTOById(Guid id)
       2 {
       3     OrderDTO dto = null;
       4 
       5     Customer customer = null;
       6 
       7     using (var session = NHibernateSession)
       8     using (var transaction = session.BeginTransaction())
       9     {
      10         dto = session.QueryOver<Order>()
      11             .JoinAlias(o => o.Customer, () => customer)
      12             .Where(o => o.Id == id)
      13             .Select(o => o.Id, o => customer.Name, o => o.OrderedDateTime,o => o.Amount)
      14             .List<object[]>()
      15             .Select(props => new OrderDTO
      16             {
      17                 Id = (Guid)props[0],
      18                 CustomerName=(string)props[1],
      19                 OrderedDateTime = (DateTime)props[2],
      20                 Amount = (decimal)props[3]
      21             }).SingleOrDefault();
      22 
      23         transaction.Commit();
      24     }
      25 
      26     return dto;
      27 }

        輸出的SQL: 

      SELECT this_.Id as y0_, customer1_.Name as y1_, this_.OrderedDateTime as y2_, this_.Amount as y3_ FROM MyWorkShop_Order this_ inner join MyWorkShop_Customer customer1_ on this_.CustomerId=customer1_.Id WHERE this_.Id = @p0;@p0 = b0a7f211-0404-4df5-93be-9ee501216c5c

       代碼說(shuō)明:

      •  代碼中的第一個(gè)Select進(jìn)行投影(Projection)操作,取出所要的4個(gè)字段,分別為o.Idcustomer.Nameo.OrderedDateTime、o.Amount;
      • .List<object[]>()把投影得到的4個(gè)字段放到一個(gè)object[]數(shù)組中;
      • 代碼中的第二個(gè)Select使用LINQ TO Object(此時(shí)與NHibernate無(wú)關(guān)),新建一個(gè)OrderDTO對(duì)象,并把object[]數(shù)組的4個(gè)字段依次賦給OrderDTO對(duì)象,字段賦值之前需進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換,把object類(lèi)型轉(zhuǎn)成相應(yīng)的類(lèi)型;
      • 由于需對(duì)每個(gè)字段進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換,所以代碼不太干凈且容易出錯(cuò),而且當(dāng)字段類(lèi)型變化時(shí)需手工修改代碼,不利于代碼重構(gòu),所以不推薦使用此方案,較好的方案是下面介紹的使用NHibernate內(nèi)置方法把投影結(jié)果轉(zhuǎn)成DTO。
       (2)根據(jù)訂單號(hào)查找訂單,并用NHibernate內(nèi)置方法轉(zhuǎn)成OrderDTO
       1 public OrderDTO GetOrderDTOById(Guid id)
       2 {
       3     OrderDTO dto = null;
       4 
       5     //定義用于內(nèi)連接的別名變量,該變量必須賦值為null
       6     Customer customer = null;
       7 
       8     using (var session = NHibernateSession)
       9     using (var transaction = session.BeginTransaction())
      10     {
      11         dto = session.QueryOver<Order>()
      12             //創(chuàng)建用于內(nèi)連接的別名customer
      13             .JoinAlias(o => o.Customer, () => customer)
      14             .Where(o => o.Id == id)
      15             .SelectList(list =>list
      16                 .Select(o => o.Id).WithAlias(() => dto.Id)    //給投影列取別名,用于把投影結(jié)果轉(zhuǎn)成DTO
      17                 .Select(o => customer.Name).WithAlias(() => dto.CustomerName)
      18                 .Select(o => o.OrderedDateTime).WithAlias(() => dto.OrderedDateTime)
      19                 .Select(o => o.Amount).WithAlias(() => dto.Amount)
      20             )
      21             //把投影結(jié)果轉(zhuǎn)成DTO
      22             .TransformUsing(Transformers.AliasToBean<OrderDTO>())
      23             .SingleOrDefault<OrderDTO>();
      24 
      25         transaction.Commit();
      26     }
      27 
      28     return dto;
      29 }
      輸出的SQL:

             同上,略

      代碼說(shuō)明:
      • SelectList()包含要投影的列;
      • WithAlias()給每個(gè)投影得到的列取別名,用于投影結(jié)果轉(zhuǎn)DTO;
      •  .TransformUsing(Transformers.AliasToBean<OrderDTO>())把投影結(jié)果轉(zhuǎn)DTO。

      2. 分組統(tǒng)計(jì)(Group)

      (1)統(tǒng)計(jì)每個(gè)客戶(hù)所有訂單的總金額,以及客戶(hù)Id
       1 public IEnumerable<CustomerIdAndTotalAmountDTO> GetCustomerIdAndTotalAmountDTOs()
       2 {
       3     CustomerIdAndTotalAmountDTO dto = null;
       4 
       5     IEnumerable<CustomerIdAndTotalAmountDTO> retList = null;
       6 
       7     using (var session = NHibernateSession)
       8     using (var transaction = session.BeginTransaction())
       9     {
      10         retList = session.QueryOver<Order>()
      11             .SelectList(list => list
      12                 .SelectGroup(o => o.Customer.Id).WithAlias(() => dto.CustomerId)
      13                 .SelectSum(o => o.Amount).WithAlias(() => dto.TotalAmount)
      14             )
      15             .TransformUsing(Transformers.AliasToBean<CustomerIdAndTotalAmountDTO>())
      16             .List<CustomerIdAndTotalAmountDTO>();
      17 
      18         transaction.Commit();
      19     }
      20 
      21     return retList;
      22 }

        輸出的SQL:

      NHibernate: SELECT this_.CustomerId as y0_, sum(this_.Amount) as y1_ FROM MyWorkShop_Order this_ GROUP BY this_.CustomerId

        代碼說(shuō)明:

      • .SelectGroup(o => o.Customer.Id)指定分組的列;
      • .SelectSum(o => o.Amount)指定對(duì)Amount調(diào)用求和聚集函數(shù),除了SelectSum外還有SelectAvg求平均、SelectCount計(jì)數(shù)、SelectMax求最大、SelectMin求最小等常見(jiàn)的聚集函數(shù)。

      3. 分頁(yè)(Paging)

       (1)分頁(yè)查找

       1 public IEnumerable<OrderDTO> GetOrderDTOsByPage(int pageIndex, int pageSize)
       2 {
       3     OrderDTO dto = null;
       4     Customer customer = null;
       5 
       6     IEnumerable<OrderDTO> retList = null;
       7 
       8     using (var session = NHibernateSession)
       9     using (var transaction = session.BeginTransaction())
      10     {
      11 
      12         retList = session.QueryOver<Order>()
      13             .JoinAlias(o => o.Customer, () => customer)
      14             .SelectList(list => list
      15                 .Select(o => o.Id).WithAlias(() => dto.Id)
      16                 .Select(o => customer.Name).WithAlias(() => dto.CustomerName)
      17                 .Select(o => o.OrderedDateTime).WithAlias(() => dto.OrderedDateTime)
      18                 .Select(o => o.Amount).WithAlias(() => dto.Amount)
      19             )
      20             .TransformUsing(Transformers.AliasToBean<OrderDTO>())
      21             .OrderBy(o=>o.Amount).Desc
      22             .Skip(pageIndex * pageSize).Take(pageSize)
      23             .List<OrderDTO>();
      24 
      25         transaction.Commit();
      26     }
      27 
      28     return retList;
      29 }

       輸出的SQL:

      SELECT TOP (@p0) y0_, y1_, y2_, y3_ FROM (SELECT this_.Id as y0_, customer1_.Name as y1_, this_.OrderedDateTime as y2_, this_.Amount as y3_, ROW_NUMBER() OVER(ORDER BY this_.Amount DESCas __hibernate_sort_row FROM MyWorkShop_Order this_ inner join MyWorkShop_Customer customer1_ on this_.CustomerId=customer1_.Id) as query WHERE query.__hibernate_sort_row > @p1 ORDER BY query.__hibernate_sort_row;@p0 = 2 [Type: Int32 (0)]@p1 = 2 [Type: Int32 (0)]

       代碼說(shuō)明:

      •  調(diào)用Skip()、Take()實(shí)現(xiàn)數(shù)據(jù)分頁(yè)讀取。
      (2)計(jì)算數(shù)據(jù)總量
       1 public int GetOrderCount()
       2 {
       3     using (var session = NHibernateSession)
       4     using (var transaction = session.BeginTransaction())
       5     {
       6         int count = session.QueryOver<Order>()
       7             .RowCount();
       8 
       9         transaction.Commit();
      10 
      11         return count;
      12     }
      13 }

       輸出的SQL:

      SELECT count(*as y0_ FROM MyWorkShop_Order this_

       代碼說(shuō)明:

      •  調(diào)用RowCount()計(jì)算數(shù)據(jù)總量。

       4. 子查詢(xún)(Subquery)

       (1)查找金額最大的訂單

       1 public Order GetMaxAmountOrder()
       2 {
       3     Order order = null;
       4 
       5     using (var session = NHibernateSession)
       6     using (var transaction = session.BeginTransaction())
       7     {
       8         var maxAmount = NHibernate.Criterion.QueryOver.Of<Order>()
       9             .SelectList(a=>a.SelectMax(o=>o.Amount));
      10                 
      11         order = session.QueryOver<Order>()
      12             .WithSubquery.WhereProperty(o => o.Amount).Eq(maxAmount)
      13             .SingleOrDefault();
      14 
      15         transaction.Commit();
      16     }
      17     return order;
      18 }

      輸出的SQL:

      SELECT this_.Id as Id9_0_, this_.CustomerId as CustomerId9_0_, this_.OrderedDateTime as OrderedD3_9_0_, this_.Amount as Amount9_0_ FROM MyWorkShop_Order this_ WHERE this_.Amount = (SELECT max(this_0_.Amount) as y0_ FROM MyWorkShop_Order this_0_)

       代碼說(shuō)明:

      •  .WithSubquery指定子查詢(xún)。

      五、總結(jié)

            本文與上一篇文章通過(guò)一個(gè)簡(jiǎn)單的實(shí)例,介紹了QueryOver進(jìn)行條件篩選(Restriction)、連接(Join)、投影(Projection)、把投影結(jié)果轉(zhuǎn)成DTO、分頁(yè)、子查詢(xún)(Subquery)等常見(jiàn)場(chǎng)景應(yīng)用。

      六、參考資料

             見(jiàn)《NHibernate 3.x新功能實(shí)踐(一) QueryOver(上)》文章最后。

      七、實(shí)例源代碼下載

             見(jiàn)《NHibernate 3.x新功能實(shí)踐(一) QueryOver(上)》文章最后。

      posted on 2011-05-16 19:24  戀戀風(fēng)塵  閱讀(4376)  評(píng)論(6)    收藏  舉報(bào)
      主站蜘蛛池模板: 欧美日韩一区二区三区视频播放| 狠狠亚洲色一日本高清色| 激情国产av做激情国产爱| 人妻中文字幕亚洲一区| 免费播放一区二区三区| 久久精品久久电影免费理论片| 亚洲国产一区二区三区最新| 亚洲国产性夜夜综合| 蜜桃一区二区三区免费看| 国产亚洲精品自在久久蜜TV| 宜兰市| 成人亚洲欧美一区二区三区| 日韩一区二区三区日韩精品| 久国产精品韩国三级视频| 国产中文字幕精品喷潮| 无码人妻斩一区二区三区| 在线a级毛片无码免费真人 | 国产露脸无套对白在线播放| 成人爽a毛片免费| 不卡国产一区二区三区| 中文字幕人妻少妇引诱隔壁| 国产精品无码无片在线观看3d| 午夜精品福利一区二区三| 国产亚洲人成网站在线观看| 亚洲精品美女久久久久9999| 国产无套内射又大又猛又粗又爽 | 欧美福利在线| 中文字幕乱偷无码av先锋蜜桃| 久操热在线视频免费观看| 丁香婷婷综合激情五月色| 高清无打码一区二区三区| 亚洲春色在线视频| 18禁男女爽爽爽午夜网站免费 | 亚洲欧美日韩愉拍自拍美利坚| 特黄aaaaaaa片免费视频| 亚洲最大av一区二区| 国产在线超清日本一本| 女性| 久久99精品久久久久久青青| 国产真实伦在线观看视频| 视频一区视频二区制服丝袜 |