新聞中心
在LINQ 查詢中,始終會用到對象??梢允褂孟嗤幕揪幋a模式來查詢和轉(zhuǎn)換 XML 文檔、SQL 數(shù)據(jù)庫、ADO.NET 數(shù)據(jù)集、.NET 集合中的數(shù)據(jù)以及對其LINQ 提供程序可用的任何其他格式的數(shù)據(jù)。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機域名、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、寶豐網(wǎng)站維護、網(wǎng)站推廣。
以前,我們要在某個報表中顯示統(tǒng)計信息一般有兩種方法:1通過一個SQL查詢——我們可以向數(shù)據(jù)庫發(fā)出一個額外的查詢來為某個特定的類別計算統(tǒng)計信息。SQL包含一系列的聚合函數(shù),并由GROUP BY子句指定應(yīng)該根據(jù)什么數(shù)據(jù)來進行統(tǒng)計。2在表示層中統(tǒng)計已經(jīng)獲取的信息。
然而這兩個方法都有他們的缺點:
第一種方法很明顯,他增加了一次到數(shù)據(jù)庫的往返,因為在獲取報表信息的時候我們已經(jīng)對數(shù)據(jù)庫進行了一次訪問,而我們要獲得的統(tǒng)計信息可以從報表中獲取。而且無法獲取更加復(fù)雜的業(yè)務(wù)統(tǒng)計。
第二種方法則沒有很好的讓層次劃分出來,我們更加希望表示層中僅僅使用方法而不要去設(shè)計這些方法。(尤其是一些業(yè)務(wù)規(guī)則,比如NBA中有“球員效率”這項數(shù)據(jù),但如果不是很熟悉這項業(yè)務(wù)的程序員是不知道這個效率是如何計算的。)
既然我們使用了分層架構(gòu),就應(yīng)該把這些職能分開,表示層的設(shè)計者只需要設(shè)計UI,了解方法的名稱就可以了。具體的業(yè)務(wù)計算應(yīng)該留下來給業(yè)務(wù)邏輯層的設(shè)計者去設(shè)計。
有了LINQ查詢我們就可以把這些東西都放到業(yè)務(wù)層去了,因為數(shù)據(jù)操作已經(jīng)對象化,在邏輯層中就可以方便地統(tǒng)計數(shù)據(jù)并且直接在表示層調(diào)用這樣的方法。
按部就班的做
1我們需要一個下來列表來選擇門類,所以我們需要一個門類列表,在Productbll中添加一個新的方法GetCategory代碼如下:
- [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)]
- public IQueryable GetCategory()
- {
- var category = from p in db.Categories
- select p;
- return category;
- }
2.代碼很簡單我就不解釋了,由于我們的重點不是這個門類選擇列表,所以我直接選擇了全部字段,其實只要ID和Name兩個字段就可以了。新建一個WEB窗體,添加一個下拉列表,在自動回送上打勾,選擇新建數(shù)據(jù)源。
3.LINQ查詢下數(shù)據(jù)源選擇對象數(shù)據(jù)源,選擇Productbll,方法選擇GetCategory,點擊完成。字段顯示填寫CategoryName,字段值填寫CategoryID。
4.然后就是顯示統(tǒng)計和從報表的方法,在GetCategory方法下添加一個新方法GetProductByCategoryID,代碼如下:
- [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)]
- public IQueryable GetProductByCategoryID(int categoryID,out decimal? total)
- {
- total = 0;
- var product = from p in db.Products
- where p.CategoryID == categoryID
- select p;
- foreach (Product p in product)
- total += p.UnitPrice;
- return product;
- }
5.簡單的代碼解釋:
1)這是一個包含2個輸出的方法,方法本身是可以作為數(shù)據(jù)源的IQueryable類型,另外還會輸出一個十進制類型數(shù),也就是總價
2)獲取CategoryID與輸入?yún)?shù)categoryID相匹配的記錄
3)遍歷這些記錄,獲取他們的價格之和
4)返回這些記錄與總價
6.在頁面中添加一個GridView與一個Lable控件,雙擊下拉列表,進入事件,加入如下代碼:
- decimal? sum = 0;
- GridView1.DataSource=product.GetProductByCategoryID(Convert.ToInt16(DropDownList1.SelectedValue),out sum);
- GridView1.DataBind();
- Label1.Text = "總價:"+Convert.ToString(sum);
7.運行該頁面,任意選擇一個門類,觀察總價和這些記錄。
小結(jié):
這章的內(nèi)容并不多,需要注意的是我們使用了返回多個結(jié)果的方法,方法本身是IQueryable類型,另外還會輸出一個十進制類型數(shù),也就是總價。我們在邏輯層中利用LINQ查詢結(jié)果,并且進行遍歷,獲得總價。在表示層中我們僅僅調(diào)用了方法,而且對數(shù)據(jù)庫僅有一次操作。
比起直接用SQL獲取總價來說,我們的方法少了一次數(shù)據(jù)庫的往返。比起在表示層寫方法,我們的方法的層次更加分明。在沒有使用這樣的結(jié)構(gòu)以前,也可以在邏輯層這么做,只不過還需要手動的把數(shù)據(jù)轉(zhuǎn)換成可以遍歷的對象,而現(xiàn)在一切都方便了??梢灾苯訉roduct表中的記錄使用for each.除此之外我們不需要做更多的工作。
本貼來自天極網(wǎng)群樂社區(qū)
當(dāng)前題目:LINQ查詢探討:一個主從報表和數(shù)據(jù)統(tǒng)計
文章位置:http://m.fisionsoft.com.cn/article/dpodggo.html


咨詢
建站咨詢
