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);
据我所知,这两段代码在功能上是相同的。我将非常感谢任何能为我解开这个谜团的人。
这应该可以做到:
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# 中循环中捕获的变量