我想从列表中过滤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来实现这种过滤?
答案 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);