C# LinqToSQL中忽略了PredicateBuilder
我已将传递给我的服务的查询序列化为一组类。此对象在树状结构中定义条件,以支持和/或将数据存储到无限深度。然后,我使用LinqToSQL将此类转换为SQL查询,但是忽略了我的条件(使用PredicateBuilder定义) PredicateBuilder似乎是一个显而易见的解决方案,我的递归函数基于C# LinqToSQL中忽略了PredicateBuilder,c#,sql,recursion,linq-to-sql,predicatebuilder,C#,Sql,Recursion,Linq To Sql,Predicatebuilder,我已将传递给我的服务的查询序列化为一组类。此对象在树状结构中定义条件,以支持和/或将数据存储到无限深度。然后,我使用LinqToSQL将此类转换为SQL查询,但是忽略了我的条件(使用PredicateBuilder定义) PredicateBuilder似乎是一个显而易见的解决方案,我的递归函数基于表达式而不是IQueryable构建。为了支持这一点,我递归地遍历树并适当地附加和/或条件 我按如下方式调用递归过滤器,在调试时,我可以看到递归函数正确返回过滤器-我的问题是这些条件被忽略,并且不会出
表达式而不是IQueryable
构建。为了支持这一点,我递归地遍历树并适当地附加和/或条件
我按如下方式调用递归过滤器,在调试时,我可以看到递归函数正确返回过滤器-我的问题是这些条件被忽略,并且不会出现在输出SQL中(请参见下文)。有人能解释为什么会出现这种情况吗
请让我知道是否需要任何其他信息,或者您是否认为这种方法应该有效
if ( hasConditions )
{
results.Where( RecursiveHandleFilterExpression( query.Criteria ) );
}
这是附加谓词的函数
private Expression<Func<Error, bool>> RecursiveHandleFilterExpression( FilterExpression filterExpression )
{
// if anding, start with true Ors start with false
Expression<Func<Error, bool>> predicate;
if ( filterExpression.FilterOperator == LogicalOperator.And )
{
predicate = PredicateBuilder.True<Error>();
}
else
{
predicate = PredicateBuilder.False<Error>();
}
// apply conditions
foreach ( ConditionExpression condition in filterExpression.Conditions )
{
if ( filterExpression.FilterOperator == LogicalOperator.And )
{
predicate.And( ApplyCondition( condition ) );
}
else
{
predicate.Or( ApplyCondition( condition ) );
}
}
// apply child filters
foreach ( FilterExpression expression in filterExpression.Filters )
{
if ( filterExpression.FilterOperator == LogicalOperator.And )
{
predicate.And( RecursiveHandleFilterExpression( expression ) );
}
else
{
predicate.Or( RecursiveHandleFilterExpression( expression ) );
}
}
return predicate;
}
和
和或
方法不会变异表达式。(对象是不可变的。)它们返回一个表示所讨论的操作的新表达式。您正在忽略代码中的返回值。我想您只是忘记了将其赋回结果-->results=results.Where(RecursiveHandleFilterExpression(query.Criteria))代码>
SELECT [t2].[ErrorId], [t2].[OrganisationId], [t2].[Severity], [t2].[Source], [t2].[ExceptionMessage], [t2].[InnerExceptionMessage], [t2].[Details], [t2].[LoggedOn]
FROM (
SELECT [t1].[ErrorId], [t1].[OrganisationId], [t1].[Severity], [t1].[Source], [t1].[ExceptionMessage], [t1].[InnerExceptionMessage], [t1].[Details], [t1].[LoggedOn], [t1].[ROW_NUMBER]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ErrorId], [t0].[OrganisationId], [t0].[Severity], [t0].[Source], [t0].[ExceptionMessage], [t0].[InnerExceptionMessage], [t0].[Details], [t0].[LoggedOn]) AS [ROW_NUMBER], [t0].[ErrorId], [t0].[OrganisationId], [t0].[Severity], [t0].[Source], [t0].[ExceptionMessage], [t0].[InnerExceptionMessage], [t0].[Details], [t0].[LoggedOn]
FROM [dbo].[Errors] AS [t0]
WHERE [t0].[OrganisationId] = @p0
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p1 + 1 AND @p1 + @p2
) AS [t2]
ORDER BY [t2].[ROW_NUMBER]
-- @p0: Input UniqueIdentifier (Size = -1; Prec = 0; Scale = 0) [f311d7f3-3755-e411-940e-00155d0c0c4b]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [51]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.17929