c# - 使用 Entity Framework 从动态创建的表中查询数据

标签 c# sql entity-framework

TLDR;如果表名在编译时未知,我如何使用 Entity Framework 从表中读取数据?

有一个处理大量信息的外部系统,然后为每个批处理运行创建一个新表,并在该表中存储一些数据。这些新表的列布局是事先已知的,因此我从现有数据库生成了一个 ADO.NET 实体数据模型(edmx 文件),其中有一个表具有完全相同的列布局。

该数据库中的原始表称为 ResultTableTemplate ,所以表示该表的实体类也称为 ResultTableTemplate .

我正在尝试弄清楚如何使用我的 ADO.NET 实体数据模型从那些动态创建的表中读取数据,并返回 IEnumerable<ResultTableTemplate> .到目前为止我所做的是:

public IEnumerable<ResultTableTemplate> GetResultsFromTable(string tableName) {
    using (var context = new WorkdataEntities()) {
        var table = context.CreateQuery<ResultTableTemplate>("SELECT " +
            "ALL_THOSE_COLUMN_NAMES... " +
            "FROM " + tableName;

        var query = from item in table select item;

        return query.ToList();
    }
}

当我运行查询时,我得到一个 System.Data.EntitySqlException带有以下消息:

'ResultTable419828' could not be resolved in the current scope or context. Make sure that all referenced variables are in scope, that required schemas are loaded, and that namespaces are referenced correctly. Near member access expression, line 1, column 225.

ResultTable419828tableName 的值

我试过了tableName + " AS ResultTableTemplate"但这没有帮助。

我有前进的道路吗,或者我是否必须在没有 Entity Framework 帮助的情况下这样做?

编辑:我现在意识到,我正在编写的查询文本并没有一直传递到底层 SQL Server 实例,而是被返回 ObjectQuery<ResultTableTemplate> 的 Entity Framework 解释。例如,它会寻找 ResultTable419828在自动生成的 DbSet 中上下文的实例。

不过,有没有办法让我实现我需要做的事情?

编辑: 谢谢 Ladislav Mrnka .现在,我这样做:

public IEnumerable<ResultTableTemplate> GetResultsFromTable(string tableName) {
    using (var context = new WorkdataEntities()) {
        var query = context.ExecuteStoreQuery<ResultTableTemplate>("SELECT " +
            "ALL_THOSE_COLUMN_NAMES... " +
            "FROM " + tableName;

        return query.ToList();
    }
}

最佳答案

这不是直接可能的。当您将实体映射到 ResultTableTemplate 时,您硬编码了该实体的表名称。实体只能映射一次(每个模型),因此在运行时对该实体的每个 EF 查询总是导致对 ResultTableTemplate 表的查询。

更改的唯一方法是在运行时修改映射文件 (SSDL),这是一种非常丑陋的 hack,因为它需要您更改 XML 文件并重新加载它。每次更改文件时,您都必须手动构建 MetadataWorkspace。构建 MetadataWorkspace 是 EF 中最消耗性能的操作之一。在正常运行中,MetadataWorkspace 每次应用程序运行仅创建一次。

有一个简单的解决方法。您知道表名和表结构——它是固定的。因此,使用直接 SQL 并使用 EF 将结果具体化到映射的实体类中:

var table = context.ExecuteStoreQuery<ResultTableTemplate>("SELECT ... FROM " + tableName);

缺点是您不能在此方法中使用 Linq,但您的要求不太适合 EF。

关于c# - 使用 Entity Framework 从动态创建的表中查询数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8896843/

相关文章:

mysql - SQL Left Join 不显示所有行

c# - Lambda 与 LINQ- "Expression is always false"

.net - 如何定义构成(上司、下属关系)

c# - SqlFunctions.StringConvert 不适用于 double

c# - 外壳图标覆盖 (C#)

c# - 设计选择 : Do I want extension methods to throw exceptions on null?

c# - 如何在给定点的情况下生成热图

java - 通过 Java Runtime.getruntime.exec() 调用 postgres 命令

mysql - SQL查询分组依据和全部

c# - 从 saveFileDialog 获取没有文件名的路径?