首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我动态地为COUNT()构建WHER-子句,为什么从LinQ生成的查询是不同的?

如果我动态地为COUNT()构建WHER-子句,为什么从LinQ生成的查询是不同的?
EN

Stack Overflow用户
提问于 2013-09-30 13:50:19
回答 1查看 156关注 0票数 0

我希望为动态构建WHERE-clause的特定查询计算行数。

让我兴奋的是,当我用两种不同的方式建造它时,我看到了不同的地方。

尝试1

代码语言:javascript
复制
int resultsCount = context.MyView.Where(x => x.Id > 100000).Count();

在我看到的分析器中,正在执行以下查询:

代码语言:javascript
复制
SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM (SELECT 
      [MyView].[Id] AS [Id], 
      [MyView].[EventTypeId] AS [EventTypeId], 
      [MyView].[EventSourceId] AS [EventSourceId], 
      [MyView].[TraceLevelId] AS [TraceLevelId], 
      [MyView].[TimeCreated] AS [TimeCreated], 
      [MyView].[Data1MaxStr] AS [Data1MaxStr]
      FROM [dbo].[MyView] AS [MyView]) AS [Extent1]
    WHERE [Extent1].[Id] > 100000
)  AS [GroupBy1]

尝试2

但我必须检查多个条件,并不是所有的条件都需要在每次执行时得到满足。因此,我尝试动态地为我的WHERE-clause构建COUNT (引用这个post):

代码语言:javascript
复制
var parameter = Expression.Parameter(typeof(MyView), "x");
Expression<Func<MyView, bool>> check1 = x => x.Id > 100000;
Expression expression = Expression.Constant(true);
expression = Expression.AndAlso(expression, Expression.Invoke(check1, parameter));
var lambda = Expression.Lambda<Func<MyView, bool>>(expression, parameter);

int resultsCount = context.MyView.Where(lambda.Compile()).Count();

我希望看到相同或至少类似的查询正在执行,但我在分析器中看到了以下内容:

代码语言:javascript
复制
SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[EventTypeId] AS [EventTypeId], 
[Extent1].[EventSourceId] AS [EventSourceId], 
[Extent1].[TraceLevelId] AS [TraceLevelId], 
[Extent1].[TimeCreated] AS [TimeCreated], 
[Extent1].[Data1MaxStr] AS [Data1MaxStr]
FROM (SELECT 
      [MyView].[Id] AS [Id], 
      [MyView].[EventTypeId] AS [EventTypeId], 
      [MyView].[EventSourceId] AS [EventSourceId], 
      [MyView].[TraceLevelId] AS [TraceLevelId], 
      [MyView].[TimeCreated] AS [TimeCreated], 
      [MyView].[Data1MaxStr] AS [Data1MaxStr]
      FROM [dbo].[MyView] AS [MyView]) AS [Extent1]

然而,resultsCount的值是相同的,但是为什么这些查询如此不同,LinQ从哪里获得第二个查询的COUNT,因为我没有看到任何COUNT被选中?

有人能告诉我如何强制一个类似于第一个的查询,但仍然动态地构建我的WHERE-clause吗?

任何暗示都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-30 14:38:00

你用你的表情打电话给Compile

这将它从一个Expression<Func<MyView, bool>>转换为一个Func<MyView, bool>。因为它只是一个委托,而不是一个Expression,所以它不再匹配IQueryable重载Where的签名,它只匹配IEnumerable重载。

这意味着查询没有被转换为SQL;您正在查询数据而根本没有过滤,然后在客户端的LINQ对象中执行筛选。

如果希望查询提供程序将查询转换为SQL,则不编译lambda非常重要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19095958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档