使用Entity Framework和WCF Ria Services開發SilverLight之6:查詢指定欄位

weixin_34391854發表於2011-06-30

對資料庫表指定欄位的查詢,又是實際工作中的一項必要工作。SL客戶端僅獲取實際需要的指定的欄位,好處很多,比如:有助於減少網路流量。

有兩類這樣的使用場景。

1:聯表查詢不需要外來鍵表

在上一篇中,我們使用了聯表查詢,在聯表查詢中,DAL部分的程式碼是這樣的:

image

我們已經指出,無論是你是否使用Include方法,只要實體類指定了Include特性,客戶端都會獲取到被關聯的Course記錄。誠然,有時候我們需要滿足聯表查詢,但是其他時候我們不需要。

2:單表中僅僅需要部分欄位

比如:一個表有5個欄位,我僅需要返回兩個欄位。

3:實現

要滿足這樣的需求,僅僅需要修改DAL部分。

第一種需求,取出指定欄位:

image

這段程式碼所生成的SQL語句如下:

SELECT 
[Extent1].[DepartmentID] AS [DepartmentID], 
[Extent1].[Name] AS [Name]
FROM [dbo].[Department] AS [Extent1]

可以發現,EF只為我們查詢兩個欄位。並且,EF也沒有為我們自動關聯Course表的資料。

注意,在這段程式碼中,我們先select new了一個匿名型別,這樣就繞過了DbContext中的DbSet<T>對於Department型別校驗。如果我們想當然的將這段程式碼寫成:

image

那麼,我們會發現無法獲取資料,跟蹤錯誤,會發現:

   {"The entity or complex type 'SchoolData.Department' cannot be constructed in a LINQ to Entities query."}    System.SystemException {System.NotSupportedException}
最終執行的效果如下:

image

回過頭來說,如果既要指定欄位,又要聯表查詢,應該怎麼做呢?如下:

image

最終執行效果如下:

image

由於本部分的程式碼在上一篇中修改而成,故不再提供下載。

PS:整了一圈回來,才發現DUDU已經把這個問題研究的很深刻了,在:

http://www.cnblogs.com/dudu/archive/2011/04/01/entity_framework_select_new_ok.html

http://www.cnblogs.com/dudu/archive/2011/03/31/entity_framework_select_new.html

相關文章