如何使用LINQ将映射表类合并为一个类

3

你好,我正在学习使用C#编写LINQ程序,并需要一些关于如何构建类的建议。

我有50个已经存在的表格在SQL Server中,需要从这些表格创建报告。这些表格都是现有的,每个表格都有几年的数据记录需要查询。

我使用LINQ to SQL设计工具将这些表格拖入程序中,得到了类似以下代码的结果:

[Table(Name = "Data_Log_1")]
public class DataLog1
{
    [Column(Name = "rid", IsPrimaryKey = true)] 
    public int R_Id;

    [Column(Name = "name", CanBeNull = false)]
    public string Name;

    [Column(Name = "Chemical_1_Amount", CanBeNull = false)]
    public int Chemical_1_Amount;

    [Column(Name = "Chemical_2_Amount", CanBeNull = false)]
    public int Chemical_2_Amount;

    // This table continues for another 20 chemicals etc...

}

在我的表单中,我可以输入查询条件并输出结果,一切都很顺利。它返回了一个包含所有数据的DataLog1实例。

于是我用同样的方式创建了第二个(共50个)表:

[Table(Name = "Data_Log_2")]
public class DataLog2
{
    [Column(Name = "rid", IsPrimaryKey = true)] 
    public int R_Id;

    [Column(Name = "name", CanBeNull = false)]
    public string Name;

    [Column(Name = "Chemical_1_Amount", CanBeNull = false)]
    public int Chemical_1_Amount;

    [Column(Name = "Chemical_2_Amount", CanBeNull = false)]
    public int Chemical_2_Amount;

    // This table continues for another 20 chemicals etc...

}
在所有50个数据日志表/类中都是相同的,因此我希望将它们全部保存在一个列表中,或者至少能够将它们作为相同类型传递。但是,我无法这样做,因为一个是DataLog1,另一个是DataLog2,尽管它们完全相同。

我能否创建一个容器类来实现这样的效果?以便将两个表读入相同的类型中?

DataLog log1 = from d in dc.DataLog1
                     select d;

DataLog log2 = from d in dc.DataLog2
                     select d;

我希望能将它们全部添加到一个名为DataLog的大列表中,如果可能的话,通过此方式进行迭代。如果可以,请告知最佳方法,考虑到有大约50个表,每个表有25个左右的列。
如果我做了什么蠢事,请随时让我知道,谢谢任何建议。

我会将它们投射到一个新类中,并使用一个属性来表示特定对象来自哪个源可枚举。 - asawyer
2个回答

2
最佳选择是尝试将所有表合并成一个表,并添加一个列来区分它们来自哪个原始表。
如果无法这样做,您可以创建一个基类。
public class DataLog
{
    [Column(Name = "rid", IsPrimaryKey = true)] 
    public int R_Id;

    [Column(Name = "name", CanBeNull = false)]
    public string Name;

    [Column(Name = "Chemical_1_Amount", CanBeNull = false)]
    public int Chemical_1_Amount;

    [Column(Name = "Chemical_2_Amount", CanBeNull = false)]
    public int Chemical_2_Amount;
}

然后为每个表派生子类

[Table(Name = "Data_Log_1")]
public class DataLog1 : DataLog
{ }

[Table(Name = "Data_Log_2")]
public class DataLog2 : DataLog
{ }

你仍然需要逐个查询它们,但你可以将每个表的所有记录添加到List<DataLog>中。


非常感谢,这正是我需要解决上述问题的方法。它适用于如上所示的表格。然而,我还有一个额外的问题,也许你可以帮忙解决。一些表格在列名中有前缀(例如DataLog 25具有Machine25_Chemical_1_Amount等...)。我能做些什么吗?还是我需要为每个表格映射字段?再次感谢。 - iXDev
可能不得不硬着头皮手动完成那些任务 :( - viggity

1

从技术上讲,您可以创建一个投影,并使用Concat将所有表联合成一个大的投影,以便您可以进行查询:

IQueryable<MyDTO> baseQuery = dc.DataLog1.Select(l => new MyDTO {...})
    .Concat(dc.DataLog2).Select(l => new MyDTO {...})
    .Concat(dc.DataLog3).Select(l => new MyDTO {...})
    ...;

但是,如果您能够使用视图将所有这些表提前连接在一起,生成一个单独的LINQ集合,您可能会发现更容易且性能更好,从而可以首先对其进行查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接