PredicateBuilder 不在循环中工作,而是手动工作

问题描述 投票:0回答:1

我正在尝试使用 LinqKit 的

PredicateBuilder
创建一些嵌套逻辑来与 SQL 进行比较,当我手动指定条件时,这工作得很好,但是当我将代码放入循环中时,我稍后会得到一个
ArgumentOutOfRangeException
当我尝试根据我构建的谓词进行查询时。这是我的代码:

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);

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

c# linq for-loop where-clause predicatebuilder
1个回答
0
投票

这应该可以做到:

   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);
    }

参见:C# 中循环中捕获的变量

© www.soinside.com 2019 - 2024. All rights reserved.