我正在使用telerik的OpenAccess ORM,並且正在對生成的代碼進行一些更改。對於具有導航性能(一鍵到另一個表)的實體,這些都爲ILists像下面這樣產生:IList在什麼時候導致查詢在ORM中執行?
private IList<SystemUser> _SystemUsers = new List<SystemUser>();
public virtual IList<SystemUser> SystemUsers
{
get
{
return this._SystemUsers;
}
}
首先,在什麼點SystemUsers
實際上對數據庫查詢?這是一個IList,所以我會認爲這將針對創建對象的數據庫執行,但我知道情況並非如此。
我想要做的是過濾掉刪除的項目在所有我生成的導航性能,我一直在更改T4模板用下面的代碼來做到這一點:
private IList<SystemUser> _SystemUsers = new List<SystemUser>();
public virtual IList<SystemUser> SystemUsers
{
get
{
if (!Entities.IncludeDeletedEntities)
{
var currentContext = Entities.GetContext(this);
ContextChanges changes = currentContext.GetChanges();
IList<SystemUser> deletedItems = changes.GetDeletes<SystemUser>();
return this._SystemUsers.Except(deletedItems).ToList(); //Question is here
}
return this._SystemUsers;
}
}
本質上講,這只是返回收集減去標記爲刪除的那些。我關心的是.ToList()
以及它何時執行。每次訪問SystemUsers
時,我都不想通過導致ToList()
與數據庫進行查詢來減慢查詢速度,但我也想篩選我的項目。我甚至不確定這個ToList()
會導致數據庫命中。我不確定代碼何時會實際到達數據庫,所以我正在尋找一些幫助/提示來過濾掉我的已刪除項目,而不會觸及數據庫,直到我在代碼中使用SystemUsers
通過添加更多的過濾器(where子句等)。
你說得很好。我想我會停止走下那條危險的道路。 – Justin 2013-03-12 14:34:33