首页 > 解决方案 > IQueryable 如何创建实体实例以及如何捕获它

问题描述

我有自己的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方法中使用,因为这将是性能问题。我怎样才能做到这一点?这种情况有更好的解决方案吗?

标签: c#iqueryableef-core-2.0

解决方案


推荐阅读