Kyl*_*e C 5 c# stack-overflow entity-framework linq-to-sql
我有一种方法,该方法基于某些参数在给定字符串列表的两个日期之间查找“交易”。当列表 > 1000 时,我在尝试迭代列表时遇到堆栈溢出异常。
这是我的代码
public List<string> CodesWithTransactionsBetweenDates(DateTime startInclusive, DateTime endExclusive, List<string> associatedCodes, int marketId)
{
List<string> codesWithTransactionsInPeriod = new List<string>();
using (var context = new MarketPlaceEntities())
{
var transactionList = (from transactions in context.Transactions
where
associatedCodes.Contains(transactions.User.Code) &&
transactions.MarketId == marketId &&
transactions.Date >= startInclusive &&
transactions.Date < endExclusive
group transactions by transactions.User.Code into uniqueIds
select new { UserCode = uniqueIds.Key });
foreach (var transaction in transactionList)
{
codesWithTransactionsInPeriod.Add(transaction.UserCode);
}
return codesWithTransactionsInPeriod;
}
}
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪......它超过了visual studio可以处理的点。
System.Data.Entity.dll!System.Data.Query.InternalTrees.BasicOpVisitor.VisitChildren(System.Data.Query.InternalTrees.Node n) + 0x3 bytes
System.Data.Entity.dll!System.Data.Query.PlanCompiler.GroupAggregateRefComputingVisitor.VisitDefault(System.Data.Query.InternalTrees.Node n) + 0x2b bytes
System.Data.Entity.dll!System.Data.Query.InternalTrees.BasicOpVisitor.VisitRelOpDefault(System.Data.Query.InternalTrees.RelOp op, System.Data.Query.InternalTrees.Node n) + 0xe bytes
System.Data.Entity.dll!System.Data.Query.InternalTrees.BasicOpVisitor.VisitApplyOp(System.Data.Query.InternalTrees.ApplyBaseOp op, System.Data.Query.InternalTrees.Node n) + 0xe bytes
System.Data.Entity.dll!System.Data.Query.InternalTrees.BasicOpVisitor.Visit(System.Data.Query.InternalTrees.OuterApplyOp op, System.Data.Query.InternalTrees.Node n) + 0xe bytes
System.Data.Entity.dll!System.Data.Query.InternalTrees.OuterApplyOp.Accept(System.Data.Query.InternalTrees.BasicOpVisitor v, System.Data.Query.InternalTrees.Node n) + 0x10 bytes
System.Data.Entity.dll!System.Data.Query.InternalTrees.BasicOpVisitor.VisitNode(System.Data.Query.InternalTrees.Node n) + 0x14 bytes
System.Data.Entity.dll!System.Data.Query.InternalTrees.BasicOpVisitor.VisitChildren(System.Data.Query.InternalTrees.Node n) + 0x60 bytes
Run Code Online (Sandbox Code Playgroud)
我的问题是有什么方法可以处理这个查询,这样我就不必担心堆栈溢出异常?
这里有两个大问题 - 对于每个唯一的 id 键,您正在内存中创建具有单个属性的新对象。此外,您还有无用的本地列表,您可以在其中复制所有这些对象。每次列表容量填满时,都会创建新的内部数组并将所有对象复制到那里。
您可以通过 IEnumerable 使用流处理。在这种情况下,您不需要将所有数据保存在内存中:
public IEnumerable<string> CodesWithTransactionsBetweenDates(
DateTime startInclusive, DateTime endExclusive,
List<string> associatedCodes, int marketId)
{
// do not use local list
using (var context = new MarketPlaceEntities())
{
return from transactions in context.Transactions
where associatedCodes.Contains(transactions.User.Code) &&
transactions.MarketId == marketId &&
transactions.Date >= startInclusive &&
transactions.Date < endExclusive
group transactions by transactions.User.Code into uniqueIds
select uniqueIds.Key; // do not create anonymous object
}
}
Run Code Online (Sandbox Code Playgroud)
If you need list, you can apply ToList()
on this query. But you definitely don't need create anonymous objects and copy them to local list.
归档时间: |
|
查看次数: |
3549 次 |
最近记录: |