2011-01-13 76 views
4

我在使用Func在LINQ to SQL查詢中使用投影時發現了一些意外的行爲。示例代碼將比單詞更好地解釋。LINQ to SQL投影:Func vs Inline

基本L2S拉姆達查詢中使用投影:

db.Entities.Select(e => new DTO(e.Value)); 

它轉換到所需的SQL:

SELECT [t1].[Value] 
FROM [Entity] AS [t1] 

然而,當該凸起被放入函數功能是這樣的:

Func<Entity, DTO> ToDTO = (e) => new DTO(e.Value); 

而且這樣調用:

db.Entities.Select(e => ToDTO(e)); 

的SQL現在拉回所有列在表中,而不僅僅是一個投影:

SELECT [t1].[Id], [t1].[Value], [t1].[timestamp], [t1].[etc...] 
FROM [Entity] AS [t1] 

所以我的問題是,我怎麼封裝這一預測沒有LINQ到SQL實例化整個實體?

要記住,我使用的DTO具有受保護的默認構造函數,所以我不能使用對象初始值設定項。由於DTO類不能被修改,所以我必須創建一個子類來實現這種行爲。這很好,如果這是唯一的解決方案。

謝謝。

編輯:

感謝Brian的解決方案。我以前嘗試過一個表達式,但無法弄清楚語法。這裏的工作代碼:

Expression<Entity, DTO> ToDTO = (e) => new DTO(e.Value); 

然後調用它像這樣:

db.Entities.Select(ToDTO); 

起初我想這樣稱呼它,這將無法編譯。這是調用Func的正確語法,但不是表達式。

db.Entities.Select(e => ToDTO(e)); 

回答

5

你可能需要創建一個Expression,而不是一個Func

Expression<Func<Entity, DTO>> ToDTO = (e) => new DTO(e.Value); 

IQueryable的擴展方法與Expression S,不Func小號

工作,通過傳遞Func,你可能調用IEnumerable擴展方法,這就是爲什麼Linq2Sql的行事方式。

+0

我該如何調用它?我試過,但無法獲得編譯代碼。 – mikesigs 2011-01-13 18:35:41