2011-01-13 56 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