У меня есть свой IQueryable
класс:
internal class IContextable<T> : IQueryable<T> where T : Entity
{
public IQueryable<T> SourceQuery { get; set; }
public KitchenAppContext Context { get; set; }
public IContextable(IQueryable<T> query, KitchenAppContext context)
{
SourceQuery = query;
Context = context;
}
public Type ElementType => SourceQuery.ElementType;
public Expression Expression => SourceQuery.Expression;
public IQueryProvider Provider => SourceQuery.Provider;
public IEnumerator<T> GetEnumerator()
{
foreach (var entity in SourceQuery)
{
if (entity.Context == null || entity.Context != Context)
entity.Context = Context;
yield return entity;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
Я использую его для загрузки сущностей из EF. Как видите, я хочу установить контекст сущностей (в методе GetEnumerator
).
Вот метод GetEntities
:
public IQueryable<T> GetEntities<T>() where T : Entity
{
IQueryable<T> query = Set<T>();
return new IContextable<T>(query, this);
}
Это работает, когда я
var users = Context.GetEntities<User>().ToList();
Устанавливает контекст сущностей. Но когда я делаю
var users = Context.GetEntities<User>().Single();
GetEnumerator
не будет работать, и контекст будет нулевым (то же самое с FirstOrDefault
, First
, ...). Я хочу просто установить контекст объекта, когда объект загружается из базы данных. Я не могу использовать .ToList()
в GetEntities
методе, потому что это будет проблемой производительности. Как я могу это сделать? Есть ли лучшее решение для этого случая?