C# 实体中断,谓词太多(解析器堆栈溢出)
在我的代码中,我允许用户通过参数扩展进行过滤。100+可以有很多不同的扩展 到目前为止,我一直在使用:C# 实体中断,谓词太多(解析器堆栈溢出),c#,entity-framework,linq,sqlite,C#,Entity Framework,Linq,Sqlite,在我的代码中,我允许用户通过参数扩展进行过滤。100+可以有很多不同的扩展 到目前为止,我一直在使用: foreach (var i in FilteredExt) { backupEvents = backupEvents.Where(e => (e.Ext != i && e.Ext != "." + i)); } 但是我注意到,如果filteredex包含少量的条目~30,那么这种方法是有效的——如果它包含更多的条目,那么查询将中断,视图将保持为空 错误:
foreach (var i in FilteredExt)
{
backupEvents = backupEvents.Where(e => (e.Ext != i && e.Ext != "." + i));
}
但是我注意到,如果filteredex包含少量的条目~30,那么这种方法是有效的——如果它包含更多的条目,那么查询将中断,视图将保持为空
错误:
位于的分析器堆栈溢出
System.Data.SQLite.SQLite3.PrepareSQLiteConnection cnn,字符串
strSql、SQLiteStatement-previous、UInt32 timeoutMS、String和stremain
位于System.Data.SQLite.SQLiteCommand.BuildNextCommand处
System.Data.SQLite.SQLiteDataReader.NextResult位于
System.Data.SQLite.SQLiteDataReader..ctorSQLiteCommand cmd,
命令行为表现在
System.Data.SQLite.SQLiteCommand.ExecuteReaderCommandBehavior
行为
System.Data.Entity.Infrastructure.InternalDispatcher1.Dispatch[TTarget,TinterAcceptionContext,TResult]TTarget
目标,Func3操作,TInterceptionContext拦截Context,
Action3正在执行,Action3在
System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.ReaderDbCommand
命令,dbcommandinterceptoncontext interceptoncontext位于
System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommandsEntityCommand
entityCommand,CommandBehavior
-System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoromRecommandSentityCommand处的内部异常堆栈跟踪结束
entityCommand,命令行为位于
System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType]ObjectContext
上下文,ObjectParameterCollection参数值位于
System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T]Func1
func,IDbExecutionStrategy executionStrategy,布尔值
startLocalTransaction,布尔ReleaseConnectionOnUnsuccess位于
System.Data.Entity.Core.Objects.ObjectQuery1.c\u DisplayClass7.b\u 5
位于System.Data.Entity.Core.Objects.ObjectQuery1.GetResultsNullable1
forMergeOption在
System.Data.Entity.Core.Objects.ObjectQuery1.b__0
位于System.Data.Entity.Internal.LazyEnumerator 1.MoveNext at
System.Collections.Generic.List1..ctorIEnumerable1集合位于
System.Linq.Enumerable.ToList[TSource]IEnumerable`1源
有没有办法处理/避免这种情况?我不确定它是否有效,但你能尝试用这种方式进行过滤吗:
var FilteredExtWithDot = FilteredExt.Select(x=>"." + x).ToArray();
backupEvents =
backupEvents
.Where(e => !FilteredExt.Contains(e.Ext) && !FilteredExtWithDot.Contains(e.Ext));
而且不需要foreach。有点怀疑这会转换成SQL。@RandRandRandom它对SQL Server有效,但我不确定更新的SQL LiteThx,我不知道你可以将一个本地列表传递给它,并且它可以正确地进行转换。有什么原因导致FiltereIndex没有存储在数据库中吗?@RandRandom主要是因为我从未想过这一点。您建议添加一个新表,并在用户每次取消/选择扩展时更新它?我想这不是一个问题-但如何在没有FilteredExt的情况下获取事件?var backupevents=context.events.SqlQueryselect*from events ev,其中ev.ext不在select fe.ext from filteredex fe;-我不知道如何将not in翻译成linq,但你可以使用它。这是一个很好的建议。当我有时间的时候,我会努力实现这一点。我想知道在过滤的情况下,它通常与在DB中保存过滤列表一起工作,还是通常保存在运行时环境中?