Как IQueryable создает экземпляр сущности и как его перехватить - PullRequest
1 голос
/ 21 мая 2019

У меня есть свой 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 методе, потому что это будет проблемой производительности. Как я могу это сделать? Есть ли лучшее решение для этого случая?

...