这两个代码片段有什么区别?

时间:2018-04-08 19:12:31

标签: entity-framework tsql select

public class RequestSell 
{
   public string name { get; set; }
   public string region { get; set; }
}

var model  = context.RequestSellctx
                    .Select(x => new RequestSellDto { ConsoleName = x.Name })
                    .ToList();

var model  =  context.RequestSellctx.Select(x => Map(x)).ToList();

private RequestSellDto Map(RequestSell x) =>
      new RequestSellDto {
           ConsoleName = x.Name
};

因为当我执行时,在T-SQL中,第一个示例只加载表的特定列,但第二个代码片段加载表中的所有列。

1 个答案:

答案 0 :(得分:2)

根本区别在于Select方法中的表达式。

在第一种情况下,您只使用name属性,因此实体框架知道它可以优化查询以仅读取该列。请注意,从x变量中,您只能命名name属性。请注意,RequestSell永远不会真正创建。

第二个片段将变量直接传递给方法以进行进一步处理。实体框架不知道该方法将做什么,因此它假设最坏并构建完整对象,然后调用Map方法并返回它返回的任何内容。

重要的区别在于,在一种情况下,直接使用select表达式,在其他情况下,它传递给外部代码,有效地完成客户端的所有工作,而第一种情况委托工作到服务器。