您好我正在使用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列。
如果我做一些愚蠢的事情随时让我知道大声笑。谢谢你的任何建议。
答案 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集合