引用另一个数据表C#的并集的数据表

时间:2013-03-20 11:45:58

标签: c# linq datatable

我的C#应用​​程序需要2 Datatables。第一个表是从数据库填充的。第二个表需要动态构建,因此它会复制第一个表中的每一行3次,并显示具有不同列名的列的子集。

到目前为止,我已经通过构建3个linq查询然后连接结果来实现这一目标。 E.g。

var query1 = from result in MainDataTable.AsEnumerable()
                         select new
                         {
                             MyRowID = result.Field<string>("MyRowID"),
                             Type = "ABC",
                             ScheduleDate = result.Field<DateTime>("Date1")
                         };

var query2 = from result in MainDataTable.AsEnumerable()
                         select new
                         {
                             MyRowID = result.Field<string>("MyRowID"),
                             Type = "DEF",
                             ScheduleDate = result.Field<DateTime>("Date2")
                         };

var query3 = from result in MainDataTable.AsEnumerable()
                         select new
                         {
                             MyRowID = result.Field<string>("MyRowID"),
                             Type = "GHI",
                             ScheduleDate = result.Field<DateTime>("Date3")
                         };

var queryFinal = query1.Concat(query2).Concat(query3);

然后我将queryFinal设置为我的日历组件的数据源。

但是,在我再次运行上述代码之前,日历组件的MainDataTable中不会显示对datasource内容的任何更改。是否可以构建一个不是复制的对象或查询,引用MainDataTable数据并因此自动刷新?

2 个答案:

答案 0 :(得分:1)

因此,我现在能想到的唯一解决方案是将DataRow包装在一个对象中。考虑这个课程:

public class ViewModel
{
    private DataRow _model;
    private string _dateField;

    public ViewModel(DataRow row, string dateField)
    {
        _model = row;
        _dateField = dateField;
    }

    public string MyRowID
    {
        get { return _model.Field<string>("MyRowID"); }
        set { _model["MyRowID"] = value; }
    }

    public string Type { get; set; }

    public DateTime ScheduleDate
    {
        get { return _model.Field<DateTime>(_dateField); }
        set { _model[_dateField] = value; }
    }
}

现在在你的LINQ语句中,构建一个ViewModel而不是你现在的匿名类型:

var query1 = from result in MainDataTable.AsEnumerable()
             select new ViewModel (result, "Date1");

现在最终查询中的模型将利用行的实例。如果它改变了,你将获得新值,但如果你改变它,它也会更新行。

答案 1 :(得分:0)

你能不能只复制行,删除不需要的列,重命名现有的列?

        DataTable tbl2 = MainDataTable.Clone();

        tbl2.Merge(MainDataTable.Copy());
        tbl2.Merge(MainDataTable.Copy());
        tbl2.Merge(MainDataTable.Copy());

        tbl2.Columns.RemoveAt(0);
        tbl2.Columns.RemoveAt(1);

        tbl2.Columns[0].ColumnName = "SomeName";
        tbl2.Columns[1].ColumnName = "SomeName";