我正在使用LINQ和LINQKit在C#中编写一个应用程序。我有一个很大的数据库表,里面有公司注册号。
我想要做一个LINQ查询,它将生成等价的SQL: select * from table1,其中regno in('123','456') 'in‘子句可能包含数千个术语。
首先,我从国家这样的领域获得公司注册号码。
然后,我将所有公司注册号添加到谓词中:
var predicate = PredicateExtensions.False<table2>();
if (RegNos != null)
{
foreach (int searchTerm in RegNos)
{
int temp = searchTerm;
predicate = predicate.Or(ec => ec.regno.Equals(temp));
}
}在Windows上,在添加4063项后发生堆栈溢出异常。在Windows 2003上,添加了大约1000个术语后,出现堆栈溢出异常。我必须尽快解决这个问题才能做一个演示。
为了解决这个问题,我使用了以下表示法:
var predicate = PredicateExtensions.False<table2>();
if (RegNos != null)
{
predicate = predicate.Or(ec => RegNos.Contains(ec.regno));
}我的问题是:
实现此功能的最快和最正确的方法)。
有人建议我停止使用LINQ,转而使用动态SQL或ADO.NET,但我认为使用LINQ和LINQKit对可维护性来说要好得多。
发布于 2016-08-31 23:42:09
很老的问题但是..。LinqKit将使用递归,堆栈将非常深入:
OR(OR(OROR(OR(OR(OR(....)))))))如果在列表中有表达式,LinqKit有一个扩展方法AggregateBalanced,它将将表达式平衡为二叉树:
OR(OR(OR(...), OR(...)),OR(OR(...), OR(...)))因此,在迭代之前调用它,递归级别更像log而不是n。
发布于 2010-06-22 09:13:43
你这里有几个问题。首先,封面下的L2S使用sp_execsql,一种SQL。SQL最多可以传递2100个参数,IIRC、常量和比较数总是作为参数发出。因此,即使表达式计算器没有死亡,结果查询也不会运行。表达式计算程序可能会因为PredicateBuilder嵌套添加了表达式而死亡,而L2S表达式计算程序正在递归地遍历表达式树。也许您可以将大型筛选器列表填充到临时表中,并对其进行连接?我相信设计人员支持命名的临时表,或者您可以使用表值sproc插入筛选值,然后使用L2S执行繁重的任务。
发布于 2014-01-05 14:59:35
正如Matt已经说过的,您的表达式树可能太大了。在我的博客上看看你是如何处理这件事的。
http://kalcik.net/2014/01/05/joining-data-in-memory-with-data-in-database-table/
https://stackoverflow.com/questions/2996364
复制相似问题