Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF6上的LINQ:查询语法和方法调用在性能方面是否存在差异?_C#_Entity Framework_Linq_Entity Framework 6_Entity Framework Core - Fatal编程技术网

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>();