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