我的数据库中有两个非常相似的表(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,我需要按此列排序结果列表,最新的。
如果属性具有不同的名称,如何进行排序?
答案 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);
但我同意克里斯:一个共同的父母类型会更清洁。