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));
我該如何調用它?我試過,但無法獲得編譯代碼。 – mikesigs 2011-01-13 18:35:41