對資料庫表指定欄位的查詢,又是實際工作中的一項必要工作。SL客戶端僅獲取實際需要的指定的欄位,好處很多,比如:有助於減少網路流量。
有兩類這樣的使用場景。
1:聯表查詢不需要外來鍵表
在上一篇中,我們使用了聯表查詢,在聯表查詢中,DAL部分的程式碼是這樣的:
我們已經指出,無論是你是否使用Include方法,只要實體類指定了Include特性,客戶端都會獲取到被關聯的Course記錄。誠然,有時候我們需要滿足聯表查詢,但是其他時候我們不需要。
2:單表中僅僅需要部分欄位
比如:一個表有5個欄位,我僅需要返回兩個欄位。
3:實現
要滿足這樣的需求,僅僅需要修改DAL部分。
第一種需求,取出指定欄位:
這段程式碼所生成的SQL語句如下:
SELECT
[Extent1].[DepartmentID] AS [DepartmentID],
[Extent1].[Name] AS [Name]
FROM [dbo].[Department] AS [Extent1]
可以發現,EF只為我們查詢兩個欄位。並且,EF也沒有為我們自動關聯Course表的資料。
注意,在這段程式碼中,我們先select new了一個匿名型別,這樣就繞過了DbContext中的DbSet<T>對於Department型別校驗。如果我們想當然的將這段程式碼寫成:
那麼,我們會發現無法獲取資料,跟蹤錯誤,會發現:
{"The entity or complex type 'SchoolData.Department' cannot be constructed in a LINQ to Entities query."} System.SystemException {System.NotSupportedException}
最終執行的效果如下:
回過頭來說,如果既要指定欄位,又要聯表查詢,應該怎麼做呢?如下:
最終執行效果如下:
由於本部分的程式碼在上一篇中修改而成,故不再提供下載。
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