如何处理动态表名

时间:2019-04-22 09:52:36

标签: c# linq dynamic casting tablename

我有很多表,需要使用Linq合并成一个结构

我需要处理许多结构相同但表名不同的表(财务数据分布20年)。我可以创建代码来动态访问各种表内容:

string tableName = "Trading.DataSources.Prices2017";
var results = DbContext.Set(Type.GetType(tableName));

但是,当我尝试使用Cast将结果从一个表转换为一个通用表(具有相同表结构的Price)时:

var newResults = results.AsQueryable().Cast<Price>().ToList();

我收到以下错误:

  

“ System.NotSupportedException:'无法将类型'Trading.DataSources.Prices2017'强制转换为'Trading.DataSources.Price'。LINQto Entities仅支持强制转换EDM基本类型或枚举类型。'”

我显然可以使用自己的转换方法进行此转换。但是,这会导致同一代码块的多个版本来适应不同的表,并且每年,当我拥有一组新的价格数据时,我都必须修改代码以适应新年的表名。 >

有没有办法动态(或一般地)处理此问题?

1 个答案:

答案 0 :(得分:1)

制作一个新的模型类SharedPrices。此类将包含这些表具有的所有相同值

var newResults = results.select(r => new SharedPrices{value1 = r.value1, value2 = r.value2}).ToList();

在我的示例中,所有Price表仅具有:

  • value1
  • value2

这些应该代替您实际的类结构。

我为您做了更多的工作,在此感谢@ Tyler-Long的回答here。 他的回答实质上指出,只要它们具有 exact 相同的属性,就可以使用JSON(反)序列化将一个类反映到另一个类中,而无需编写强制转换,例如:

using Newtonsoft.Json;

string tableName = "Trading.DataSources.Prices2017";
var tableType = Type.GetType(tableName);
var results = DbContext.Set(tableType);
Price newResults = JsonConvert.DeserializeObject<tableType>(JsonConvert.SerializeObject(results.ToList()));

我认为,这将使您能够将表转换为单一价格模型,而不必显式编写转换逻辑。唯一的缺点是它将对Newtonsoft.json包的依赖项添加到您的项目中(可以通过nuget下拉)。我以前曾经亲自使用过这个软件包,并且它是可靠的。