如何使用LINQ将映射表类组合到一个类中

时间:2015-08-27 15:09:28

标签: c# sql-server linq

您好我正在使用C#学习LINQ,并需要一些建议如何构建我的类。

我需要在sql server中创建50个现有表来创建报告。这些是现有的,每个都需要查询几年的数据记录。

我使用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列。

如果我做一些愚蠢的事情随时让我知道大声笑。谢谢你的任何建议。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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 {...})
    ...;

但是你可能会发现它更容易,并且看到更好的性能,如果你可以使用View提前将所有这些表连接在一起来生成一个可以在一开始就查询的LINQ集合