Einen Stapelüberlauf mit zu vielen Höfen bekommenC#

Ein Treffpunkt für C#-Programmierer
Guest
 Einen Stapelüberlauf mit zu vielen Höfen bekommen

Post by Guest »

Wenn ich eine Abfrage auf einem DBSet mit zu vielen concat erstelle oder wo Klauseln einen Stapelüberlauffehler erhalte.
im Wesentlichen Ich habe das Problem, in dem ich eine Liste von Tausenden von und Klauseln habe, die alle mit oder Klauseln verbunden sind. Es würde ein bisschen wie: < /p>
aussehen

Code: Select all

(A AND B) OR (C AND D) OR ...
Die Klauseln werden aus einer Liste erstellt, sodass die Anzahl der und Klauseln, die durch die oder -Klauseln verkettet werden, dynamisch ist und zwischen 0 und Tausenden liegen könnte. < /p>
Ich habe versucht, Auswahl für jede und Klausel zu erstellen und mithilfe von concat mithilfe von Entity Framework miteinander zu kombinieren, aber ich erhalte eine Stapelüberlaufausnahme.
Ich habe das Gefühl, dass es einen besseren Weg geben sollte, den Code zu schreiben, aber ich bin mir nicht sicher, dass ich den Fehler und einen Beispielcode in einer Hoffnung eingeschlossen habe Zurück zum Schreiben von Inline SQL (geht gegen das Entity Framework Paradigm) < /p>
Der genaue Fehler lautet wie folgt: < /p>

Code: Select all

Stack overflow.
Repeat 798 times:
--------------------------------
at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.Visit[[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](System.Collections.ObjectModel.ReadOnlyCollection`1, System.Func`2, StateType ByRef, State[] ByRef, Boolean)
at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.Visit(System.Collections.ObjectModel.ReadOnlyCollection`1, StateType ByRef, State[] ByRef, Boolean)
at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitMethodCall(System.Linq.Expressions.MethodCallExpression)
at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.Visit(System.Linq.Expressions.Expression)
--------------------------------
at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.Visit[[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](System.Collections.ObjectModel.ReadOnlyCollection`1, System.Func`2, StateType ByRef, State[] ByRef, Boolean)
at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.Visit(System.Collections.ObjectModel.ReadOnlyCollection`1, StateType ByRef, State[] ByRef, Boolean)
< /code>
Bibliotheken: < /p>
[list]
[*]EFCore.BulkExtensions.PostgreSql
Version = "8.1.2"
[*]

Code: Select all

Microsoft.EntityFrameworkCore.Design
Version = "9.0.0"
[*]

Code: Select all

Npgsql.EntityFrameworkCore.PostgreSQL
Version = "9.0.2"
[*]

Code: Select all

Npgsql.EntityFrameworkCore.PostgreSQL.Design
Version = "1.1.0"
[/list]
Hier ist ein Beispiel, wie das Problem reproduziert wird:

Code: Select all

private class SimpleDbContext : DbContext
{
// Stores the values 0, 1, 2, ..., 100000
public virtual DbSet SequencePoints { get; set; }
}

private class SequencePoint
{
public int SequenceNumber { get; set; }
}

private void ConcatErrorTest()
{
SimpleDbContext simpleDbContext = new();

List selectRanges = new(); // 0, 10, 11, 20, 21, 21, etc...

for (int i = 0; i < 7500; i++)
{
int startRange = i * 10;
int endRange = startRange + (i % 5);
selectRanges.Add(new Tuple(startRange, endRange));
}

IQueryable queryable = null;

foreach (Tuple selectRange in selectRanges)
{
IQueryable whereQueryable = simpleDbContext.SequencePoints.AsQueryable().Where(point =>
(point.SequenceNumber >= selectRange.Item1) &&
(point.SequenceNumber  sequenceNumber.SequenceNumber).ToList();

_logger.LogInformation("result = {result}", result);
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post