我试图用直接的方式从视图中选择一些列,如下面的代码片段
var q = new TDSViewConnection();
var trials = q.progressive_filtering_lookup_decoded_v
.Where(z => z.source == "")
.Select(z => z.trial_id);为上述表达式生成的SQL语句如下所示
SELECT
[Extent1].[trial_id] AS [trial_id]
FROM
(SELECT
[progressive_filtering_lookup_decoded_v].[master_protocol_id] AS [master_protocol_id],
[progressive_filtering_lookup_decoded_v].[trial_id] AS [trial_id],
[progressive_filtering_lookup_decoded_v].[source] AS [source],
[progressive_filtering_lookup_decoded_v].[discipline_code] AS [discipline_code],
[progressive_filtering_lookup_decoded_v].[crop_team_code] AS [crop_team_code],
[progressive_filtering_lookup_decoded_v].[crop_name] AS [crop_name],
[progressive_filtering_lookup_decoded_v].[pest_name] AS [pest_name],
[progressive_filtering_lookup_decoded_v].[country_code] AS [country_code],
[progressive_filtering_lookup_decoded_v].[year] AS [year]
FROM
[dbo].[progressive_filtering_lookup_decoded_v] AS [progressive_filtering_lookup_decoded_v]) AS [Extent1]
WHERE
N'' = [Extent1].[source]问题是为什么有两个select语句?我认为应该只发表一项声明。
发布于 2017-05-23 21:22:55
使用实体框架,您将在LINQ语句所表达的内容的掩护下获得SQL生成。在我看来,LINQ语句是根据代码的初步部分执行它的第一个选择,然后当您再次使用'.Select‘关键字时,实际上是在对先前检索的结果集执行子查询。
换句话说:var trials = q.progressive_filtering_lookup_decoded_v.Where(z => z.source == "")是初始查询,它将返回一个结果集。
然后运行.Select(z => z.trial_id);,它使用第一个结果集作为起点运行一个单独的查询。
这就是在生成的SQL中看到两个select语句的原因。
发布于 2017-05-24 05:19:21
正如其他用户所发布的那样,您的结果查询是一个投影结果,或者是整个查询的子集。因此,查询引擎将把完整的对象作为源,并简单地从其中选择您想要的项,从而产生子查询。
如果您查看SQL Server中的查询计划性能,那么运行该查询的方式与EF进行查询的方式和您可能期望看到的查询方式之间通常没有真正的区别。
这里的主要好处是,由于您只需要一个列,EF确保从数据库返回的全部内容。通常,我发现确保您的结果集最小是所需的函数。随着更复杂的预测,这一点变得更加明显。
https://stackoverflow.com/questions/44144495
复制相似问题