首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LINQ to SQL Projection: Func vs Inline

LINQ to SQL Projection: Func vs Inline
EN

Stack Overflow用户
提问于 2011-01-14 01:59:28
回答 1查看 1.6K关注 0票数 5

在使用Func的LINQ to SQL查询中使用投影时,我发现了一些意外的行为。示例代码将比文字更好地解释。

使用投影的基本L2Sλ查询:

代码语言:javascript
运行
复制
db.Entities.Select(e => new DTO(e.Value));

它将转换为所需的SQL:

代码语言:javascript
运行
复制
SELECT [t1].[Value]
FROM [Entity] AS [t1]

但是,当投影放到Func中时,如下所示:

代码语言:javascript
运行
复制
Func<Entity, DTO> ToDTO = (e) => new DTO(e.Value);

名字是这样的:

代码语言:javascript
运行
复制
db.Entities.Select(e => ToDTO(e));

SQL现在正在调回表中的所有列,而不仅仅是投影中的列:

代码语言:javascript
运行
复制
SELECT [t1].[Id], [t1].[Value], [t1].[timestamp], [t1].[etc...]
FROM [Entity] AS [t1]

所以我的问题是,在没有LINQ to SQL实例化整个实体的情况下,我如何封装这个投影?

请记住,我使用的DTO有一个受保护的默认构造函数,所以我不能使用对象初始化器。由于DTO类不能修改,因此我必须创建一个子类来实现该行为。这很好,如果这是唯一的解决方案。

谢谢。

编辑:

感谢Brian的解决方案。我之前尝试过一个表达式,但不能理解其语法。下面是工作代码:

代码语言:javascript
运行
复制
Expression<Entity, DTO> ToDTO = (e) => new DTO(e.Value);

然后这样叫它:

代码语言:javascript
运行
复制
db.Entities.Select(ToDTO);

一开始我试着这样叫它,它不能编译。这是调用Func的正确语法,但不是表达式。

代码语言:javascript
运行
复制
db.Entities.Select(e => ToDTO(e));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-14 02:20:16

您可能需要创建Expression,而不是Func

代码语言:javascript
运行
复制
Expression<Func<Entity, DTO>> ToDTO = (e) => new DTO(e.Value);

IQueryable扩展方法适用于Expression%s,而不是Func%s

通过传入Func,您可能正在调用IEnumerable扩展方法,这就是为什么Linq2Sql会这样做的原因。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4683427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档