C# EF Core通过字符串获取DBSet,然后在查询中使用它

C# EF Core通过字符串获取DBSet,然后在查询中使用它,c#,entity-framework-core,ef-core-3.0,C#,Entity Framework Core,Ef Core 3.0,我正在尝试制作一个工具,使用户能够从ui中选择表/列。当用户将“查询配置对象”发布到服务器时,我想使用Entity Framework Core创建一个动态的SQL查询 范例 给定var tableName=“Table1” 我想抓取DbSet,然后运行类似 var dbSet = GetDbSet("Table1"); var stuff = await dbSet.Take(10).ToListAsync(); 我相信这在某种形式上是可能的,但我看到的所有文章在方法上都是相似的。一切都会编

我正在尝试制作一个工具,使用户能够从ui中选择表/列。当用户将“查询配置对象”发布到服务器时,我想使用Entity Framework Core创建一个动态的SQL查询

范例

给定
var tableName=“Table1”

我想抓取
DbSet
,然后运行类似

var dbSet = GetDbSet("Table1");
var stuff = await dbSet.Take(10).ToListAsync();
我相信这在某种形式上是可能的,但我看到的所有文章在方法上都是相似的。一切都会编译,但当我运行它时,我得到的
对象引用未设置为对象的实例

以下是我所拥有的:

var select = GetDbSet(tableName);
var results = await select.Take(10).ToListAsync();
GetDbSet方法:

这显然是可行的,但我需要对
T
进行变量化(我不能这么做??)

这正是我所期待的:

    private IQueryable GetDbSet(string name)
    {
        // forcing a type instead of fiddling with the string for simplicity
        return _dbContext.Set(_dbContext.Table1.GetType());
    }
但是,此代码不会编译:

var select = GetDbSet(tableName);
var results = await select.Take(10).ToListAsync();
“IQueryable”不包含“Take”和“no”的定义 可访问扩展方法“Take”接受类型为的第一个参数 可以找到“IQueryable”(您是否缺少using指令或 装配参考?)


我抓取一个
DbSet
并使用它进行查询的路径是否正确?我是否需要为
Take
和我想要使用的任何其他方法构建扩展方法?

您是否有
using System.Linq?这就是
Take
和其他一些扩展方法的来源。如果已经有了非泛型集合方法,为什么还要构建自己的非泛型集合方法?@Gleb没有。EF Core 3.0FWIW中只有一个设置:我在这个用例中放弃了EF。我找到了SqlKata(),它(目前)似乎更有能力构建动态查询,而且更易于使用。我感觉EF Core不想让你做这种事。
    private IQueryable GetDbSet(string name)
    {
        // forcing a type instead of fiddling with the string for simplicity
        return _dbContext.Set(_dbContext.Table1.GetType());
    }
var select = GetDbSet(tableName);
var results = await select.Take(10).ToListAsync();