订购并连接两个不同类型的列表

时间:2012-10-18 14:03:35

标签: c# linq

我的数据库中有两个非常相似的表(tblCar和tblPlane)。 它们具有相同的列,只有tblCar以car_开头,而tblPlane以pl_开头。 即car_id,pl_id等。

我从表中获取行并将它们连接起来:

var cars = (from x in db.tblCar select x).ToList();
var planes = (from x in db.tblPlane select x).ToList();
var result = cars.Cast<object>().Concat(planes.Cast<object>());

它运作正常。

但是,两个表都有一个更新日期列:cat_update和pl_update。它的类型是DateTime,我需要按此列排序结果列表,最新的。

如果属性具有不同的名称,如何进行排序?

3 个答案:

答案 0 :(得分:1)

var orderedResult = cars.Cast<object>().Concat(planes.Cast<object>())
    .OrderBy(o => o is Car? ((Car)o).car_date : ((Plane)o).pl_date);

但这不是很安全。如果您的表具有相同的列,为什么不能将所有值都放在同一列中,并使用位字段告诉您它是汽车还是飞机?

答案 1 :(得分:1)

您是否考虑为Car和Plane创建父类型,类似于可以强制转换为两者的Vehicle类?您的车辆类别中的一个字段将是_date。所以代码看起来像这样:

var orderedResults = cars.Cast<Vehicle>().Concat(planes.Cast<Vehicle>())
       .OrderBy(v => v._date);

这样你就可以保留编译时类型安全&amp;有一个更逻辑的类型层次结构,因为两个表中的所有列都是相同的,您不应该将它们表示为车辆。

答案 2 :(得分:0)

你可以这样做:

private class VehicleHolder
{
    public DateTime Date { get; set;}
    public object Vehicle { get;set; }
}

//...

var cars = (from x in db.tblCar 
            select new VehicleHolder() { Date = x.car_date, Vehicle = x }).ToList();
var planes = (from x in db.tblPlane 
              select new VehicleHolder() { Date = x.pl_date, Vehicle = x }).ToList();

var result = cars.Concat(planes).OrderBy(v => v.Date).Select(v => v.Vehicle);

但我同意克里斯:一个共同的父母类型会更清洁。