我希望为动态构建WHERE-clause的特定查询计算行数。
让我兴奋的是,当我用两种不同的方式建造它时,我看到了不同的地方。
尝试1
int resultsCount = context.MyView.Where(x => x.Id > 100000).Count();在我看到的分析器中,正在执行以下查询:
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):
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();我希望看到相同或至少类似的查询正在执行,但我在分析器中看到了以下内容:
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吗?
任何暗示都将不胜感激。
发布于 2013-09-30 14:38:00
你用你的表情打电话给Compile。
这将它从一个Expression<Func<MyView, bool>>转换为一个Func<MyView, bool>。因为它只是一个委托,而不是一个Expression,所以它不再匹配IQueryable重载Where的签名,它只匹配IEnumerable重载。
这意味着查询没有被转换为SQL;您正在查询数据而根本没有过滤,然后在客户端的LINQ对象中执行筛选。
如果希望查询提供程序将查询转换为SQL,则不编译lambda非常重要。
https://stackoverflow.com/questions/19095958
复制相似问题