【发布时间】:2019-09-11 12:48:52
【问题描述】:
我有许多表需要使用 Linq 组合成一个结构
我需要处理许多具有相同结构但表名不同的表(财务数据跨越 20 年)。我可以创建代码来动态访问各种表格内容:
string tableName = "Trading.DataSources.Prices2017";
var results = DbContext.Set(Type.GetType(tableName));
但是,当我尝试使用 Cast 将结果从一个表转换为一个公共表(具有相同表结构的价格)时:
var newResults = results.AsQueryable().Cast<Price>().ToList();
我收到以下错误:
"System.NotSupportedException: '无法将类型 'Trading.DataSources.Prices2017' 转换为类型 'Trading.DataSources.Price'。LINQ to Entities 仅支持转换 EDM 基元或枚举类型。'"
我显然可以用我自己的转换方法进行这种转换。但是,这会导致同一代码块的多个版本以适应不同的表格,并且每年,当我有一组新的价格数据时,我必须修改我的代码以适应新年的表格名称。
有没有办法动态地(或一般地)处理这个问题?
【问题讨论】:
-
您需要使用
创建一个通用接口,因为数据库表在实体模型中具有不同的类映射但具有相似的结构。请参阅以下内容:stackoverflow.com/questions/50136396/generic-entity-base-class -
非常感谢您的快速回复。我之前创建了一个通用版本,它避开了字符串表名 GetType 代码。然而,使用泛型并不能解决组合问题——现在,如何将泛型表结构(Prices2018、Prices 2017 等的类映射)转换为通用表结构(Prices 的类映射)而不编写特定的转换代码,即使用某些东西像 Linq 的 Cast 扩展?。
-
@jdweng - 我使用的是 EF 6,所以不确定如何在 EF 生成的代码中启用继承。
-
您使用的是实体 DbContext,项目包含 c# 类和数据库表之间的映射数据。该链接显示了如何更改映射到数据库的 c# 类。
标签: c# linq dynamic casting tablename