0

我的数据库中有两个非常相似的表(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,我需要按此列对结果列表进行排序,最新的在前。

属性名称不同时如何排序?

4

3 回答 3

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

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

于 2012-10-18T14:07:05.170 回答
1

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

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

通过这种方式,您可以保留编译时类型安全性并具有更合乎逻辑的类型层次结构,因为两个表中的所有列都是相同的,您应该没有任何困难将它们表示为车辆。

于 2012-10-18T14:19:04.153 回答
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);

但我同意 Chris 的观点:共同的父类型会更干净。

于 2012-10-18T14:24:47.023 回答