Linq to object簡單描述
學(xué)習(xí)Linq to object時,經(jīng)常會遇到Linq to object問題,這里將介紹XX問題的解決方法。
普通存儲過程,首先在查詢分析器運行下面的代碼來創(chuàng)建一個存儲過程:
- create proc sp_singleresultset
- as
- set nocount on
- select * from customers
然后打開IDE的服務(wù)器資源管理器,之前我們從表中拖動表到dbml設(shè)計視圖,這次我們從存儲過程中找到剛才創(chuàng)建的存儲過程,然后拖動到設(shè)計視圖。在方法面板中可以看到已經(jīng)創(chuàng)建了一個sp_singleresultset的方法
然后打開Northwind.designer.cs,可以找到下面的代碼:
- [Function(Name="dbo.sp_singleresultset")]
- public ISingleResult<sp_singleresultsetResult> sp_singleresultset()
- {
- IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())));- return ((ISingleResult<sp_singleresultsetResult>)(result.ReturnValue));
- }
我們可以發(fā)現(xiàn),IDE為這個存儲過程單獨生成了返回結(jié)果集的實體定義,你可能會覺得很奇怪,IDE怎么知道這個存儲過程將會返回哪些數(shù)據(jù)那?其實,在把存儲過程拖拽入dbml設(shè)計視圖的時候,IDE就執(zhí)行了類似下面的命令:
- SET FMTONLY ON;
- exec Northwind.dbo.sp_singleresultset
- SET FMTONLY OFF;
這樣就可以直接獲取存儲過程返回的元數(shù)據(jù)而無須執(zhí)行存儲過程。
其實我們存儲過程返回的就是顧客表的數(shù)據(jù),如果你覺得為存儲過程單獨設(shè)置結(jié)果集實體有些浪費的話可以在存儲過程的屬性窗口中調(diào)整返回類型從“自動生成的類型”到Customer,不過以后你只能通過刪除方法面板中的存儲過程,然后重新添加來還原到“自動生成的類型”。下面,我們可以寫如下的Linq to object代碼進行查詢:
- var 單結(jié)果集存儲過程 = from c in ctx.sp_singleresultset()
- where c.CustomerID.StartsWith("A")
- select c;
在這里確實是Linq to object的,因為查詢句法不會被整句翻譯成SQL,而是從存儲過程的返回對象中再去對對象進行查詢。SQL代碼如下:
- EXEC @RETURN_VALUE = [dbo].[sp_singleresultset]
- -- @RETURN_VALUE: Output Int32 (Size = 0; Prec = 0; Scale = 0)
【編輯推薦】