使用Entity Framework和WCF Ria Services開(kāi)發(fā)SilverLight之6:查找指定字段
對(duì)數(shù)據(jù)庫(kù)表指定字段的查找,又是實(shí)際工作中的一項(xiàng)必要工作。SL客戶端僅獲取實(shí)際需要的指定的字段,好處很多,比如:有助于減少網(wǎng)絡(luò)流量。
有兩類這樣的使用場(chǎng)景。
1:聯(lián)表查詢不需要外鍵表
在上一篇中,我們使用了聯(lián)表查詢,在聯(lián)表查詢中,DAL部分的代碼是這樣的:
我們已經(jīng)指出,無(wú)論是你是否使用Include方法,只要實(shí)體類指定了Include特性,客戶端都會(huì)獲取到被關(guān)聯(lián)的Course記錄。誠(chéng)然,有時(shí)候我們需要滿足聯(lián)表查詢,但是其他時(shí)候我們不需要。
2:?jiǎn)伪碇袃H僅需要部分字段
比如:一個(gè)表有5個(gè)字段,我僅需要返回兩個(gè)字段。
3:實(shí)現(xiàn)
要滿足這樣的需求,僅僅需要修改DAL部分。
第一種需求,取出指定字段:
這段代碼所生成的SQL語(yǔ)句如下:
SELECT [Extent1].[DepartmentID] AS [DepartmentID], [Extent1].[Name] AS [Name] FROM [dbo].[Department] AS [Extent1]
可以發(fā)現(xiàn),EF只為我們查詢兩個(gè)字段。并且,EF也沒(méi)有為我們自動(dòng)關(guān)聯(lián)Course表的數(shù)據(jù)。
注意,在這段代碼中,我們先select new了一個(gè)匿名類型,這樣就繞過(guò)了DbContext中的DbSet<T>對(duì)于Department類型校驗(yàn)。如果我們想當(dāng)然的將這段代碼寫(xiě)成:
那么,我們會(huì)發(fā)現(xiàn)無(wú)法獲取數(shù)據(jù),跟蹤錯(cuò)誤,會(huì)發(fā)現(xiàn):
{"The entity or complex type 'SchoolData.Department' cannot be constructed in a LINQ to Entities query."} System.SystemException {System.NotSupportedException}
最終運(yùn)行的效果如下:
回過(guò)頭來(lái)說(shuō),如果既要指定字段,又要聯(lián)表查詢,應(yīng)該怎么做呢?如下:
最終運(yùn)行效果如下:
由于本部分的代碼在上一篇中修改而成,故不再提供下載。
PS:整了一圈回來(lái),才發(fā)現(xiàn)DUDU已經(jīng)把這個(gè)問(wèn)題研究的很深刻了,在:
http://www.rzrgm.cn/dudu/archive/2011/04/01/entity_framework_select_new_ok.html
http://www.rzrgm.cn/dudu/archive/2011/03/31/entity_framework_select_new.html





浙公網(wǎng)安備 33010602011771號(hào)