Linq使用ForEach过滤项目会导致大型数据集崩溃

时间:2013-10-03 08:16:10

标签: c# linq entity-framework-5

我想从列表中过滤Recon个项目。我想将Recon个具有Transaction个对象的对象与属性SrcObjType等于" 13"在Transactions列表中。

// The model is like this 

public partial class Recon
{

  public int ReconNum { get; set; }
  public virtual ICollection<Transaction> Transactions { get; set; }
}

public partial class Transaction
{
  public long TransactionId { get; set; }
  public Nullable<System.DateTime> DocumentDate { get; set; }
  public string SrcObjTyp { get; set; }
  public virtual Recon Recon { get; set; }
}

// this works for a few items but crashes on large data sets (million rows large)

List<Recon> reconsWithType13Trans = new List<Recon>();
db.Transactions.Where(t => t.SrcObjTyp == "13")
  .ToList().ForEach(t => reconsWithType13Trans.Add(t.Recon));

我认为foreach正在吃很多内存,然后该程序会引发Out of Memory Exception。

我的问题是如何尽可能有效地过滤这些项目。如果可能,不需要太多记忆。是否有另一种可能性而不使用foreach来实现这种过滤?

1 个答案:

答案 0 :(得分:1)

试试这个:

List<Recon> reconsWithType13Trans = db.Transactions
                     .Where(t => t.SrcObjTyp == "13")
                     .Select(t => t.Recon).ToList();

这不会加载内存中的所有Transaction,只会加载Recon

您还可以使用IQueryable<Recon>并利用EF中的延迟执行:

var reconsWithType13Trans = db.Transactions
                     .Where(t => t.SrcObjTyp == "13")
                     .Select(t => t.Recon);