尽管我的 DBA 强烈反对,但我最近将实体框架用于一个项目。所以有一天他来到我的办公室抱怨生成的 T-SQL 到达他的数据库。
例如,当我想根据 id 选择产品时,我会这样写:
context.Products.FirstOrDefault(p=>p.Id==id);
这转化为
SELECT ... FROM (SELECT TOP 1 ... FROM PRODUCTS WHERE ID=@id)
所以他在喊,“你到底为什么要写一个 SELECT * FROM (SELECT TOP 1)”
所以我将代码更改为
context.Products.Where(p=>p.Id==id).ToList().FirstOrDefault()
这会产生一个更干净的 T-SQL:
SELECT ... FROM PRODUCTS WHERE ID=@id
内部查询和 TOP 1 消失了。够啰嗦了,我的问题是:第一个查询真的会给 SQL Server 带来开销吗?比第二种方法更难解析吗?Id 列上有一个聚集索引。我想要一个好的答案,这样我就可以把它擦在他(或我的)脸上
谢谢,
提莫