Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LinqToSQL中忽略了PredicateBuilder_C#_Sql_Recursion_Linq To Sql_Predicatebuilder - Fatal编程技术网

C# LinqToSQL中忽略了PredicateBuilder

C# LinqToSQL中忽略了PredicateBuilder,c#,sql,recursion,linq-to-sql,predicatebuilder,C#,Sql,Recursion,Linq To Sql,Predicatebuilder,我已将传递给我的服务的查询序列化为一组类。此对象在树状结构中定义条件,以支持和/或将数据存储到无限深度。然后,我使用LinqToSQL将此类转换为SQL查询,但是忽略了我的条件(使用PredicateBuilder定义) PredicateBuilder似乎是一个显而易见的解决方案,我的递归函数基于表达式而不是IQueryable构建。为了支持这一点,我递归地遍历树并适当地附加和/或条件 我按如下方式调用递归过滤器,在调试时,我可以看到递归函数正确返回过滤器-我的问题是这些条件被忽略,并且不会出

我已将传递给我的服务的查询序列化为一组类。此对象在树状结构中定义条件,以支持和/或将数据存储到无限深度。然后,我使用LinqToSQL将此类转换为SQL查询,但是忽略了我的条件(使用PredicateBuilder定义)

PredicateBuilder似乎是一个显而易见的解决方案,我的递归函数基于
表达式而不是
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