我正在使用 Telerik 的 OpenAccess ORM,并且正在对生成的代码进行一些更改。对于具有导航属性(另一个表的键)的实体,这些属性会生成为 IList,如下所示:
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()
它何时执行。我不想通过ToList()
每次访问时都对数据库进行查询来减慢查询速度SystemUsers
,但我也想过滤我的项目。我什至不确定这ToList()
是否会导致数据库命中。我不确定代码何时会真正命中数据库,因此我正在寻找一些帮助/提示来过滤掉我已删除的项目而不使其命中数据库,直到我SystemUsers
通过添加更多过滤器(where 子句, ETC)。