新聞中心
LINQ投影以及使用LINQ的擴展方法是我們經(jīng)常使用LINQ查詢方法,那么關(guān)于LINQ投影以及使用LINQ的擴展方法有什么需要我們注意的方面么?讓我們來看看具體的實現(xiàn)。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),潞城企業(yè)網(wǎng)站建設(shè),潞城品牌網(wǎng)站建設(shè),網(wǎng)站定制,潞城網(wǎng)站建設(shè)報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,潞城網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
1、LINQ查詢之LINQ投影
如果說剛才的查詢,還只是很簡單的查詢,那么結(jié)合匿名類來實現(xiàn)投影查詢,則是LINQ提供的一個利器,這種方法非常靈活,同時也滿足了我們絕大部分的查詢需求。下面我們來看一個例子:我們需要查詢出部門工資的總和,怎么做呢?
- var query = from department in dbdata.Departments
- select new{ depid = department.DepId, depname=
- department.DepName, depsalary =
- department.Employees.Sum(e => e.EmployeeSalary) };
這句查詢語句中,在new關(guān)鍵字后面生成了一個匿名類,這個類有三個屬性,分別是 depid,depname和depsalary,其中,depsalary是經(jīng)過計算獲得,這句話被轉(zhuǎn)換成:
- SELECT [t0].[DepId] AS [depid], [t0].[DepName] AS [depname],
- (SELECT SUM([t1].[EmployeeSalary]) FROM [dbo].[Employee]
- AS [t1] WHERE [t1].[DepId] = [t0].[DepId] ) AS [depsalay]
- FROM [dbo].[Department] AS [t0]
好優(yōu)雅的代碼,實在是太方便了。
2、LINQ查詢之使用LINQ的擴展方法
LINQ提供了很多擴展方法,方便我們做各種查詢,我們來看幾個典型的擴展方法:
a)使用LINQ的擴展方法之Average、Max
- Decimal x = dbdata.Employees.Average(e => e.EmployeeSalary);
- Decimal y = dbdata.Employees.Max(e => e.EmployeeSalary);
這是計算出員工的平均工資與最大工資,你不需要編寫任何的SQL語句,Orcas中提供的LINQ到SQL對象關(guān)系映射器會處理獲取,跟蹤,和更新映射到你的數(shù)據(jù)庫數(shù)據(jù)定義和存儲過程的對象。你只要使用任何LINQ擴展方法對結(jié)果進行過濾和構(gòu)形即可,LINQ到SQL會執(zhí)行獲取數(shù)據(jù)所需的SQL代碼(注意,上面的 Average和Max 擴展方法很明顯地不會從數(shù)據(jù)表中返回所有的數(shù)據(jù)行,它們會使用TSQL的聚合函數(shù)來計算數(shù)據(jù)庫中的值,然后只返回一個標量值)。
b)使用LINQ的擴展方法之Where、OrderBy
有時候,我們只對某張表做簡單的查詢和排序,那么,這個時候不必寫冗長的LINQ語句,直接使用LINQ擴展方法即可,如:
- var query = dbdata.Employees.
- Where(e => e.EmployeeSalary > 2000).
- OrderBy(e => e.EmployeeName);
這里使用了Lambda語法,這句話被轉(zhuǎn)換成以下的SQL語句:
- SELECT [t0].[EmployeeId], [t0].[DepId], [t0].[EmployeeName],
- [t0].[EmployeeSalary] FROM [dbo].[Employee] AS [t0]
- WHERE [t0].[EmployeeSalary] > @p0 ORDER BY [t0].[EmployeeName]
以上是通過利用由Lambda提供的對表達式樹支持,以及IQueryable
C)使用LINQ的擴展方法之Take、Skip
對于大批量的數(shù)據(jù)處理,一直是開發(fā)人員的比較頭疼的事情,微軟在.NET1.1到2.0中的Gridview等控件,對大批量數(shù)據(jù)的處理上一直都不是很理想,LINQ對于大批量數(shù)據(jù)的處理,可以很好的解決這個方面的問題。
- var query = dbdata.Employees.Skip(10).Take(10);
這句話表示跳過該表的10條記錄,再取10條,也就是取第11至20條記錄,轉(zhuǎn)換成SQL語句如下:
- SELECT [t1].[EmployeeId], [t1].[DepId], [t1].[EmployeeName],
- [t1].[EmployeeSalary] FROM (SELECT ROW_NUMBER()
- OVER (ORDER BY [t0].[EmployeeId], [t0].[DepId], [t0].[EmployeeName],
- [t0].[EmployeeSalary]) AS [ROW_NUMBER], [t0].[EmployeeId], [t0].[DepId],
- [t0].[EmployeeName], [t0].[EmployeeSalary] FROM [dbo].[Employee]
- AS [t0]) AS [t1] WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND
- @p0 + @p1 ORDER BY [t1].[ROW_NUMBER]
從以上這句SQL語句來看,最消耗性能分頁操作完全交給了數(shù)據(jù)庫操作,其處理的機制不再像Gridview控件的分頁,是將數(shù)據(jù)全部取出,然后再進行分頁顯示,因此效率上要高了很多。
D)使用LINQ的擴展方法之ToList和ToArray
在默認情況下,查詢結(jié)果的數(shù)據(jù)類型是IEnumerable
LINQ查詢之LINQ投影以及使用LINQ的擴展方法的使用就向你介紹到這里,希望對你了解和學習LINQ查詢遺跡LINQ投影和使用LINQ的擴展方法有所幫助。
當前題目:LINQ查詢方式的探尋
文章轉(zhuǎn)載:http://fisionsoft.com.cn/article/cosideo.html


咨詢
建站咨詢
