Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理动态表名_C#_Linq_Dynamic_Casting_Tablename - Fatal编程技术网

C# 如何处理动态表名

C# 如何处理动态表名,c#,linq,dynamic,casting,tablename,C#,Linq,Dynamic,Casting,Tablename,我有许多表需要使用Linq组合成一个结构 我需要处理许多具有相同结构但不同表名的表(财务数据跨越20年)。我可以创建代码来动态访问各种表内容: string tableName = "Trading.DataSources.Prices2017"; var results = DbContext.Set(Type.GetType(tableName)); 但是,当我尝试使用Cast将一个表的结果转换为一个公共表(具有相同表结构的价格)时: var newResults = results.As

我有许多表需要使用Linq组合成一个结构

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

string tableName = "Trading.DataSources.Prices2017";
var results = DbContext.Set(Type.GetType(tableName));
但是,当我尝试使用Cast将一个表的结果转换为一个公共表(具有相同表结构的价格)时:

var newResults = results.AsQueryable().Cast<Price>().ToList();
var newResults=results.AsQueryable().Cast().ToList();
我得到以下错误:

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

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


有没有一种方法可以动态地(或一般地)处理这个问题?

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

var newResults = results.select(r => new SharedPrices{value1 = r.value1, value2 = r.value2}).ToList();
在我的示例中,所有价格表仅包含:

  • 价值1
  • 价值2
这些应该取代你的实际班级结构

我为你做了更多的挖掘,我想对@Tyler的回答给予长期的赞扬。 他的回答本质上指出,您可以使用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;
string tableName=“Trading.DataSources.Prices2017”;
var tableType=Type.GetType(tableName);
var results=DbContext.Set(tableType);
Price newResults=JsonConvert.DeserializeObject(JsonConvert.SerializeObject(results.ToList());

我认为这将为您提供将表转换为单一价格模型的能力,而无需显式地编写转换逻辑。唯一的缺点是它在Newtonsoft.json包(可以通过nuget下拉)上为您的项目添加了依赖项。不过,我个人以前使用过这个包,它是可靠的。

您需要使用创建一个通用接口,因为数据库表在实体模型中具有不同的类映射,但具有相似的结构。请看以下内容:非常感谢您的快速回复。我之前创建了一个通用版本,其中包含字符串tablename GetType代码。但是,使用泛型并不能解决组合问题,即如何将泛型表结构(Prices2018、prices2017等的类映射)转换为通用表结构(Prices的类映射)没有编写特定的转换代码,例如使用Linq的Cast扩展?。继承性如何:@jdweng-我使用的是EF 6,因此不确定如何在EF生成的代码中启用继承。您使用的是DbContext,它是实体,项目包含c#类和数据库表。该链接展示了如何更改映射到数据库的c#类。感谢您的建议。这个解决方案或多或少就是我到目前为止一直在做的事情。然而,我希望找到一个不那么冗长的解决方案,比如Cast扩展(它不适用于不同的映射)。再次感谢。对我来说,这似乎是最不冗长的选择。根据我的经验,唯一的替代方法是使用继承(这需要更多的代码),或者编写显式转换,因为不存在隐式转换(也需要更多的代码)。这总是可以被抽象成一个方法,然后它变成一个单线。如果你考虑设置26个值,它会尖叫一个更优雅的解决方案;不幸的是,Linq Cast扩展在这种情况下确实起作用。感谢您的反馈LINQ Cast扩展仅适用于&enum。它不是用来映射类属性的。抱歉,我想说(并重复)Cast不起作用-这是我第一次提出这个问题的原因(请参阅与我的原始提交相关的黄色文本)。我希望有另一种解决方法。我将接受你的回答,因为这或多或少是我在提交之前提出的。再次感谢你,也感谢其他人。