【发布时间】:2013-03-12 12:04:53
【问题描述】:
我正在使用 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 子句等)。
【问题讨论】:
标签: .net linq orm telerik telerik-open-access