C# EF6上的LINQ:查询语法和方法调用在性能方面是否存在差异?
哪种语法可以提高性能C# EF6上的LINQ:查询语法和方法调用在性能方面是否存在差异?,c#,entity-framework,linq,entity-framework-6,entity-framework-core,C#,Entity Framework,Linq,Entity Framework 6,Entity Framework Core,哪种语法可以提高性能 var vRec = (bNoTracking ? tblOrders.AsNoTracking() : tblOrders); return vRec .Where(x => (x.WarehouseId == iWarehouseId) && (x.OrderId == iOrderId)) .FirstOrDefault<tblOrder>(); var vRec=(bNoTracking?tblOrders.A
var vRec = (bNoTracking ? tblOrders.AsNoTracking() : tblOrders);
return vRec
.Where(x => (x.WarehouseId == iWarehouseId) && (x.OrderId == iOrderId))
.FirstOrDefault<tblOrder>();
var vRec=(bNoTracking?tblOrders.AsNoTracking():tblOrders);
返回vRec
其中(x=>(x.WarehouseId==iWarehouseId)&&(x.OrderId==iOrderId))
.FirstOrDefault();
或
var vRec=(bNoTracking?tblOrders.AsNoTracking():tblOrders);
返回(来自vRec中的rec)
其中(rec.WarehouseId==iWarehouseId)&(rec.OrderId==iOrderId)
选择rec)
.FirstOrDefault();
此问题适用于EF-6(适用于SQL Express 2014)和EF-7版本7.0.0-rc1-final(适用于SQLite)
注意:我不是在寻找关于编码风格差异的意见,只是想知道是否有技术上的原因来选择彼此。两个查询都将转换为相同的SQL,这意味着性能将是相同的。这取决于您是喜欢“流畅”语法(
.Where()
)还是喜欢LINQ查询表达式(Where
)
从我的测试MSSQL数据库生成的SQL如下所示,通过LINQPad显示:
这看起来就像它将得到的一样优化,所以我想说,除非在某种循环中运行此select,否则无需进一步调整。两个查询都将转换为相同的SQL,这意味着性能将相同。这取决于您是喜欢“流畅”语法(
.Where()
)还是喜欢LINQ查询表达式(Where
)
从我的测试MSSQL数据库生成的SQL如下所示,通过LINQPad显示:
这看起来已经尽可能地优化了,所以我想说,除非在某种循环中运行此select,否则无需进一步调整。检查为其生成的SQL。虽然我可以想象结果是一样的,但我可以确认,两个查询返回的@ScottKaye MSDN都以相当大的优势击败了您:)
public static类DbSetExtensions{public static idset WithNoTrackingOf(this IDbSet dbSet,bool notrackingsflag)=>notrackingsflag?dbSet.AsNoTracking():dbSet;}
然后返回vRec.WithNoTrackingOf(bNoTracking).FirstOrDefault(x=>x.WarehouseId==iWarehouseId&&x.OrderId=iOrderId)代码>。请停止使用匈牙利符号。请这是2016年,因为大声呼喊,而不是1996年!它只是做了一些修改:publicstaticiqueryable with notrackingof(这个IDbSet dbSet,bool noTrackingFlag),其中T:class=>noTrackingFlag?AsNoTracking():dbSet代码>检查为其生成的SQL。虽然我可以想象结果是一样的,但我可以确认,两个查询返回的@ScottKaye MSDN都以相当大的优势击败了您:)public static类DbSetExtensions{public static idset WithNoTrackingOf(this IDbSet dbSet,bool notrackingsflag)=>notrackingsflag?dbSet.AsNoTracking():dbSet;}
然后返回vRec.WithNoTrackingOf(bNoTracking).FirstOrDefault(x=>x.WarehouseId==iWarehouseId&&x.OrderId=iOrderId)代码>。请停止使用匈牙利符号。请这是2016年,因为大声呼喊,而不是1996年!它只是做了一些修改:publicstaticiqueryable with notrackingof(这个IDbSet dbSet,bool noTrackingFlag),其中T:class=>noTrackingFlag?AsNoTracking():dbSet代码>更具体地说-查询语法转换为方法语法,然后再转换为SQL(或提供程序使用的任何查询语言/结构)-更具体地说,查询语法转换为方法语法,然后再转换为SQL(或提供程序使用的任何查询语言/结构)-
var vRec = (bNoTracking ? tblOrders.AsNoTracking() : tblOrders);
return (from rec in vRec
where (rec.WarehouseId == iWarehouseId) && (rec.OrderId == iOrderId)
select rec)
.FirstOrDefault<tblOrder>();