为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理动态表名

如何处理动态表名

C#
斯蒂芬大帝 2022-12-24 13:46:19
我有许多表需要使用 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 原语或枚举类型。”我显然可以用我自己的转换方法进行这种转换。然而,这会导致同一代码块的多个版本以满足不同的表,并且每年,当我有一组新的价格数据时,我必须修改我的代码以适应新的一年的表名。有没有办法动态地(或一般地)处理这个问题?
查看完整描述

1 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

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


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

对于我的例子,所有价格表只有:


价值1

值2

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


我为你做了更多的挖掘,我想感谢@Tyler-Long在这里的回答。他的回答基本上指出,只要它们具有完全相同的属性,您就可以使用 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 下拉)。虽然我以前亲自使用过这个包,但它是可靠的。


查看完整回答
反对 回复 2022-12-24
  • 1 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号