我试图使用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);
据我所知,这两段代码在功能上是相同的.我将非常感谢任何能够为我解开这个谜团的人.