c# - Linq Filtering items with ForEach crashes for large data set

标签 c# linq entity-framework-5

我想从列表中过滤Recon 项目。我想获取所有具有 Transaction 对象的 Recon 对象,其 Transactions< 中的属性 SrcObjType 等于“13”/ 列表。

// 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 正在占用大量内存,然后程序会引发内存不足异常。

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

最佳答案

试试这个:

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

这不会加载所有 Transaction s在内存中,只有他们的Recon .

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

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

关于c# - Linq Filtering items with ForEach crashes for large data set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19154109/

相关文章:

c# - 创建排序 Func<IQueryable<T>、IOrderedQueryable<T>>?

c# - LINQ到实体- Entity Framework

c# - Entity Framework 代码首先更新数据库在 CREATE DATABASE 上失败

entity-framework - 对于新的 EF 项目,EntityTypeConfiguration 和 DbMigration 有什么区别

c# - 如何在 C# 中切换 XML XDocument XElement 中的属性

c# - 有没有办法通过字符串或索引访问 Dapper FastExpando 中的列?

c# - 如何测试 IEnumerable<int>

c# - 如何将 "SELECT col, COUNT(*)"转换为 Linq 表达式?

c# 7.x 使用元组类型的短名称

c# - Azure AD 身份验证 : Permission error while fetching access token