LINQ:'选择c'和'选择新(c ......')之间的区别

Wah*_*eed 5 c# linq asp.net linq-to-sql

这两个陈述有什么区别:

 var result = from c in context.CustomerEntities
 join p in context.ProjectEntities on c.Pk equals p.CustomerPk
 where p.Entered > DateTime.Now.AddDays(-15)
 select c; 
Run Code Online (Sandbox Code Playgroud)

 var result = from c in context.CustomerEntities
 join p in context.ProjectEntities on c.Pk equals p.CustomerPk
 where p.Entered > DateTime.Now.AddDays(-15)
 select new (c.Company, c.Entered, c.pk);
Run Code Online (Sandbox Code Playgroud)

这些陈述中是否存在与绩效相关的问题.(为简单起见,c只包含这3个coloums.)

谢谢.

Mar*_*ell 10

这两个陈述有什么区别

第一个返回原始/完整源对象的过滤序列; 第二个仍然使用过滤器,但返回一个只包含这三个属性的匿名类型的序列.

这些陈述中是否存在与绩效相关的问题

性能取决于后端.如果这是LINQ-to-Objects,那么new {...}每条记录都会创建额外的对象(匿名类型),因此可能会有非常小的开销.但是,如果这是LINQ-to-SQL等(数据库后端),那么这可能是一个巨大的好处.查询构建器将检查需要哪些列,并且只会获取anon类型中的三列; 如果您在数据中有(例如)BLOB(或者只是长varchar),那么这可能是一个巨大的好处.

附加说明:您不能在方法的签名中包含匿名类型,因此您可能会发现需要为此目的声明自己的DTO类型:

return new CustomerDto { Company = c.Company, Entered = c.Entered, PK = c.pk};
...
public class CustomerDto { ... }
Run Code Online (Sandbox Code Playgroud)