2015-01-12 48 views
0

我得到了c#appliaction和entity famework作爲ORM。 我得到了數據庫表Images。表格有Id,TimeStamp,Data列。 此表可以有真正的ALOT實體。還有Data列包含大字節數組。 我需要從第一個實體開始,或以前5個爲例。使用大量數據

var result = Images.OrderBy(img => img.TimeStamp).FirstOrDefault(img => img.TimeStamp > someDate); 

拋出內存異常。 有什麼方法可以通過? 我應該使用存儲過程還是其他?

+1

查看索引,創建一個按TimeStamp排序並從該索引進行選擇操作的索引。 – Sefa

+0

是不是圖像是對象的物化列表?然後我可以理解爲什麼當你嘗試排序時,它會拋出內存異常。 – smiech

+0

您還可以將其中包含大量數據的列標記爲虛擬。 – hazimdikenli

回答

2

如果Images已經是查詢對象,那麼當你OrderBy它,它訪問整個集合。我假設它不是,它直接是您的DbSet或EF IQueryable(因此您使用Linq-To-Entities查詢而不是Linq-To-Objects查詢,並且在對數據庫的查詢上完成排序,以及不在返回的整個集合上)。

除非你需要變更跟蹤檢測,使用上AsNoTrackingDbSet(在這種情況下,Context.Images.AsNoTracking().OrderBy(...)。這應該降低受了不少的內存要求(更改跟蹤檢測需要超過兩倍的內存)。

而且,如果使用大型Blob數據,將其存儲在自己的表中(只有iddata),並且只在需要時訪問它(在您正在執行的表/實體上引用此id您的操作)如果您正在使用ORM並且想要始終與原始實體一起工作(您還可以使用Select將查詢投影到新實體上)在blob領域)。

如果你需要一直訪問返回行的圖像數據,並且系統中沒有足夠的內存,那麼運氣不好。