首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用谓词生成器的LinqKit堆栈溢出异常

使用谓词生成器的LinqKit堆栈溢出异常
EN

Stack Overflow用户
提问于 2010-06-08 10:07:01
回答 3查看 1.3K关注 0票数 1

我正在使用LINQ和LINQKit在C#中编写一个应用程序。我有一个很大的数据库表,里面有公司注册号。

我想要做一个LINQ查询,它将生成等价的SQL: select * from table1,其中regno in('123','456') 'in‘子句可能包含数千个术语。

首先,我从国家这样的领域获得公司注册号码。

然后,我将所有公司注册号添加到谓词中:

代码语言:javascript
复制
        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个术语后,出现堆栈溢出异常。我必须尽快解决这个问题才能做一个演示。

为了解决这个问题,我使用了以下表示法:

代码语言:javascript
复制
        var predicate = PredicateExtensions.False<table2>();
        if (RegNos != null)
        {
            predicate = predicate.Or(ec => RegNos.Contains(ec.regno));
        }

我的问题是:

  1. 为什么使用源程序循环会发生堆栈溢出?
  2. (我认为Windows 2003的每个进程\线程的堆栈比NT\2000\XP\Vista\Windows 7工作站版本的Windows.
  3. 要小得多。
  4. 是使用LINQ和LINQKit?

实现此功能的最快和最正确的方法)。

有人建议我停止使用LINQ,转而使用动态SQL或ADO.NET,但我认为使用LINQ和LINQKit对可维护性来说要好得多。

EN

回答 3

Stack Overflow用户

发布于 2016-08-31 23:42:09

很老的问题但是..。LinqKit将使用递归,堆栈将非常深入:

代码语言:javascript
复制
OR(OR(OROR(OR(OR(OR(....)))))))

如果在列表中有表达式,LinqKit有一个扩展方法AggregateBalanced,它将将表达式平衡为二叉树:

代码语言:javascript
复制
OR(OR(OR(...), OR(...)),OR(OR(...), OR(...)))

因此,在迭代之前调用它,递归级别更像log而不是n。

https://github.com/scottksmith95/LINQKit/blob/96626e863784bac5d324c5cb4b189f5cb902d1ab/src/LinqKit/AggregateBalanced.cs

票数 2
EN

Stack Overflow用户

发布于 2010-06-22 09:13:43

你这里有几个问题。首先,封面下的L2S使用sp_execsql,一种SQL。SQL最多可以传递2100个参数,IIRC、常量和比较数总是作为参数发出。因此,即使表达式计算器没有死亡,结果查询也不会运行。表达式计算程序可能会因为PredicateBuilder嵌套添加了表达式而死亡,而L2S表达式计算程序正在递归地遍历表达式树。也许您可以将大型筛选器列表填充到临时表中,并对其进行连接?我相信设计人员支持命名的临时表,或者您可以使用表值sproc插入筛选值,然后使用L2S执行繁重的任务。

票数 1
EN

Stack Overflow用户

发布于 2014-01-05 14:59:35

正如Matt已经说过的,您的表达式树可能太大了。在我的博客上看看你是如何处理这件事的。

http://kalcik.net/2014/01/05/joining-data-in-memory-with-data-in-database-table/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2996364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档