C# 铸造DbSet<;实体>;至其数据库集<;积极性>;无需将所有实体拉入内存

C# 铸造DbSet<;实体>;至其数据库集<;积极性>;无需将所有实体拉入内存,c#,linq,entity-framework,C#,Linq,Entity Framework,我的问题是,我正在使用的系统期望数据为iQuereable,而entityframework给我的数据为iQuereable 这是我需要实现的一个接口: public IQueryable<T> GetData<T>() where T : class, IData {} 我不想将所有数据都放到内存中并进行强制转换,没有其他解决方案吗?IQueryable是协变的,因此与其尝试将DbSet强制转换为DbSet,只需分配: Data = context.Set<En

我的问题是,我正在使用的系统期望数据为
iQuereable
,而entityframework给我的数据为
iQuereable

这是我需要实现的一个接口:

public IQueryable<T> GetData<T>() where T : class, IData {}
我不想将所有数据都放到内存中并进行强制转换,没有其他解决方案吗?

IQueryable
是协变的,因此与其尝试将
DbSet
强制转换为
DbSet
,只需分配:

Data = context.Set<Entity>(); // .AsQueryable() not needed but does make it more readable

我在应用程序中最终使用的代码是:

public IQueryable<T> GetData<T>() where T : class, IData
{
    var factory = EntityFrameworkConfiguration.TypeFactory[typeof(T)];
    var context = factory.Item2();
    ThreadDataManager.GetCurrentNotNull().OnDispose += () =>
    {             
        context.Dispose();
    };

    var method = typeof(DbContext).GetMethod("Set", new Type[0]).MakeGenericMethod(factory.Item1);
    IQueryable<T> genericItem = (IQueryable < T >)method.Invoke(context, new object[0]);
    return genericItem;
}
public IQueryable GetData(),其中T:class,IData
{
var factory=EntityFrameworkConfiguration.TypeFactory[typeof(T)];
var context=factory.Item2();
ThreadDataManager.GetCurrentNotNull().OnDispose+=()=>
{             
context.Dispose();
};
var method=typeof(DbContext).GetMethod(“Set”,新类型[0]).MakeGenericMethod(factory.Item1);
IQueryable genericItem=(IQueryable)方法。调用(上下文,新对象[0]);
返回泛型项;
}

需要注意的是,ThreadDataManager是我正在集成的系统的内置部分。

如果C1Data是一个接口而不是实际实现,这也会起作用吗?似乎我让它起作用了。我确信我尝试过类似的东西,但没有成功。一切正常,谢谢。
where Entity: C1Data
public IQueryable<T> GetData<T>() where T : class, IData
{
    var factory = EntityFrameworkConfiguration.TypeFactory[typeof(T)];
    var context = factory.Item2();
    ThreadDataManager.GetCurrentNotNull().OnDispose += () =>
    {             
        context.Dispose();
    };

    var method = typeof(DbContext).GetMethod("Set", new Type[0]).MakeGenericMethod(factory.Item1);
    IQueryable<T> genericItem = (IQueryable < T >)method.Invoke(context, new object[0]);
    return genericItem;
}