私は 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 句、where 句、等)。