我试图使用LinqKit的PredicateBuilder来创建一些嵌套逻辑来与SQL进行比较,当我手动指定条件时,这可以很好地工作,但当我将代码放入循环中时,我会得到ArgumentOutOfRangeException,当我try 根据我构建的断言进行查询时.这是我的代码:

var outerPredicate = PredicateBuilder.New<DataRow>();
var innerPredicate = PredicateBuilder.New<DataRow>();
for (int i = 0; i < 4; i++)
{
    innerPredicate = PredicateBuilder.New<DataRow>();
    for (int j = 0; j < 1; j++)
    {
        innerPredicate = innerPredicate.Or(y => y.Field<string>(sqlNames[i]) == filters[i][j]);
    }
    outerPredicate = outerPredicate.And(innerPredicate);
}

即使我将每个循环设置为只运行一次,此代码always也会产生相同的ArgumentOutOfRangeException,但此代码运行得很完美:

var outerPredicate = PredicateBuilder.New<DataRow>();
var innerPredicate = PredicateBuilder.New<DataRow>();
innerPredicate = innerPredicate.Or(y => y.Field<string>(sqlNames[3]) == filters[3][0]);
innerPredicate = outerPredicate.And(innerPredicate);
innerPredicate = PredicateBuilder.New<DataRow>();
innerPredicate = innerPredicate.Or(y => y.Field<string>(sqlNames[2]) == filters[2][0]);
outerPredicate = outerPredicate.And(innerPredicate);
innerPredicate = PredicateBuilder.New<DataRow>();
innerPredicate = innerPredicate.Or(y => y.Field<string>(sqlNames[1]) == filters[1][0]);
outerPredicate = outerPredicate.And(innerPredicate);
innerPredicate = PredicateBuilder.New<DataRow>();
innerPredicate = innerPredicate.Or(y => y.Field<string>(sqlNames[0]) == filters[0][0]);
outerPredicate = outerPredicate.And(innerPredicate);

据我所知,这两段代码在功能上是相同的.我将非常感谢任何能够为我解开这个谜团的人.

推荐答案

这应该可以做到:

   var outerPredicate = PredicateBuilder.New<DataRow>();
    var innerPredicate = PredicateBuilder.New<DataRow>();
    for (int i = 0; i < 4; i++)
    {
        innerPredicate = PredicateBuilder.New<DataRow>();
        for (int j = 0; j < 1; j++)
        {
            var ii=i;var jj=j;
            innerPredicate = innerPredicate.Or(y => y.Field<string>(sqlNames[ii]) == filters[ii][jj]);
        }
        outerPredicate = outerPredicate.And(innerPredicate);
    }

见:Captured variable in a loop in C#

Csharp相关问答推荐

应用程序启动时出现错误:操作无法同时使用表单和SON主体参数

无法更改或使用C#(WinForms.NET)中的全局变量

有没有方法让ASP.NET Core模型绑定器使用私有设置器来设置属性?

编写DataAnnotations自定义验证器的多种方法

如何阻止注释被包含在C#release build. exe中

Blazor. NET 8—阶段启动配置文件不启动网站VS2022

ITypeLib2.GetLibStatistics()在C#中总是抛出AccessViolationException

在静态模式下实例化配置

将类移动到新命名空间后更新RavenDB Raven-Clr-Type

RabbitMQ群集的MassTransit配置问题

如何让两个.NET版本不兼容的项目对话?

为值对象编写自定义JsonConverter

使用动态键从请求体反序列化JSON

如何让游戏对象在切换场景时被销毁,但在开始新游戏时重新锁定

解决方案:延长ABP框架和ANGING OpenIddict中的令牌生命周期

.NET EF Core Automapper项目到筛选不起作用

ASP.NET核心MVC|如何在控制器方法之间传递值

客户端/服务器RPC如何处理全局变量?

使用Try-Catch-Finally为API端点处理代码--有什么缺点?

无法创建工具窗口(用于VBIDE、VBA的COM加载项扩展)