c# – PredicateBuilder嵌套OR子句,导致大型谓词的嵌套太深的问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – PredicateBuilder嵌套OR子句,导致大型谓词的嵌套太深的问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2166字,纯文字阅读大概需要4分钟。
内容图文
![c# – PredicateBuilder嵌套OR子句,导致大型谓词的嵌套太深的问题](/upload/InfoBanner/zyjiaocheng/817/5d4f7be2f63e47878be02bcf3943b611.jpg)
简介:我一起使用PredicateBuilder到Or()几个表达式,然后将该组合表达式发送到OrmLite的Select()方法.但是,生成的SQL有一个WHERE子句,其中包含许多嵌套括号,SQL Server会抛出错误.我该怎么做才能解决这个问题?
细节:我有一个表Foo有两列,Bar和Baz.如果我有一组Bar / Baz值并且我想找到所有匹配的行,那么我可能(例如)发出以下SQL:
SELECT * FROM Foo WHERE (Bar=1 AND Baz=1) OR (Bar=2 AND Baz=3) OR ...
由于我使用的是OrmLite,我使用PredicateBuilder为我生成where子句:
var predicate = PredicateBuilder.False<Foo>();
foreach (var nextFoo in fooList)
predicate = predicate.Or(foo => nextFoo.Bar == foo.Bar &&
nextFoo.Baz == foo.Baz);
Db.Select(predicate);
如果我在列表中使用3个Foos执行此操作,则生成的SQL看起来像这样(为了简洁而清理,但故意留在一行上以表明一点):
SELECT Bar, Baz FROM Foo WHERE ((((1=0) OR ((1=Bar) AND (1=Baz))) OR ((2=Bar) AND (3=Baz))) OR ((2=Bar) AND (7=Baz)))
请注意主要括号?在添加下一个表达式之前,PredicateBuilder会不断地将现有表达式括起来,以便x – > (x)或y – >; ((x)或y)或z等
我的问题:当我要查找数十个或数百个项目时,生成的SQL有几十个或几百个嵌套括号,SQL Server用SqlException将其踢回:
Some part of your SQL statement is nested too deeply. Rewrite the query or break it up into smaller queries.
那我该怎么办呢?如果我想避免嵌套异常,我需要展平生成的SQL的WHERE子句(如上面的示例查询).我知道我可以动态生成自己的SQL并将其发送到OrmLite的SqlList方法,但被迫这样做会使OrmLite的值减半.
解决方法:
由于SQL不会使OR短路,因此您可以转换看起来像这样的表达式树
OR
OR
OR
OR
到一个如下所示的表达式树:
OR
/ / / OR OR
/ \ / OR OR OR OR
这只是一种解决方法:理想情况下,框架应该能够处理这种情况.
构造这样一棵树的一种方法是将列表递归地分成两半,递归地从每一半构造一个“OR-tree”,然后将两个“OR-tree”与另一个OR组合:
Predicate ToOrTree(List<Foo> fooList) {
if (fooList.Count > 2) {
var firstHalf = fooList.Count / 2;
var lhs = ToOrTree(fooList.Take(firstHalf).ToList());
var rhs = ToOrTree(fooList.Skip(firstHalf).ToList());
return lhs.Or(rhs);
}
Predicate res = PredicateBuilder.Create<Foo>(
foo => fooList[0].Bar == foo.Bar && fooList[0].Baz == foo.Baz
);
if (fooList.Count == 2) {
res = res.Or(
foo => fooList[1].Bar == foo.Bar && fooList[1].Baz == foo.Baz
);
}
return res;
}
内容总结
以上是互联网集市为您收集整理的c# – PredicateBuilder嵌套OR子句,导致大型谓词的嵌套太深的问题全部内容,希望文章能够帮你解决c# – PredicateBuilder嵌套OR子句,导致大型谓词的嵌套太深的问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。