我正在使用带有EF-6.x的MVC Core,并且正在使用Lambda表达式,但是我的上级告诉我使用LINQ的原因,因为使用lambda和where子句时,它将从数据库中提取所有数据,稍后它将有条件时适用。在LINQ的情况下,如果使用where条件,它将仅提取经过过滤的数据。请让我知道什么是正确的?
例如Lambda: context.tablename.where(condition);// Should I go with this
LINQ: (from T in tablename where t.(condition));// or this?
答案 0 :(得分:1)
两种语法都将转换为相同的IL代码。如果将过滤器应用于服务器端或客户端,则区别在于源是IQueryable<T>
还是IEnumerable<T>
。
答案 1 :(得分:1)
请让我知道什么是正确的?
e.gLambda:context.tablename.where(condition); //我应该这样做
LINQ :(从表名中的T,其中t。(条件)在哪里); //还是这个?
简短的回答:这并不重要。由于context.tablename
最终返回了IQueryable<T>
,因此Entityframework将不尝试访问数据库,直到您尝试从表达式中迭代最终结果为止,更不用说{{1} }和.ToArray()
,分别为您进行迭代。
无论您使用LINQ表达式语法(被编译为LINQ方法)还是LINQ方法,当您尝试开始迭代结果时,Entityframework都会为您创建一个.ToList()
树,在完全由您的查询组成的引擎盖(包括Expression
,Where
,Join
等)。由于LINQ的结构可能与SQL查询(或任何数据源查询)的结构不完全匹配,因此取决于源(即数据库,例如SQL Server),因此Entityframework会尝试对表达式进行最佳的优化树,以便其结构与源上的可执行查询(例如SQL Server查询)匹配。最后,它将表达式树转换为实际查询,并针对数据源执行该查询,并返回您的数据(当然,在完成所有映射之后)。
如果真的,我是说 REALLY 想了解GroupBy
引擎工作原理的复杂性,建议您浏览一下Matt Warren的系列文章:“ {{ 3}}”。那实际上不是Entityframework,但它具有相同的概念。
答案 2 :(得分:0)
我的前辈告诉我为什么要使用LINQ,因为在使用lambda的同时 子句将从数据库中提取所有数据,以后再应用 条件在哪里。
您的上级是错误的,您可以使用您希望它们相同的语句,两者都将在数据库级别过滤数据。如果您将Sql Server作为数据库服务器,则可以使用Sql Server Profiler转储这两个语句执行的查询,您会发现它们是相同的。