2012-10-18 52 views
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,我需要按此列排序结果列表,最新的列表。

如何在属性具有不同名称时进行排序?

+0

也许这不是最优雅的解决方案,但您可以沿结果进行迭代,并使用DateTime字段作为关键字(使用基于typeOf的条件子句)将每个项插入到SortedList类中。 – maralfol

回答

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

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

+0

为什么不安全? –

+0

@Srcee因为你将它们转换为对象,如果你犯了一个错误,你可能会遇到运行时错误而不是编译器错误。 –

1

您是否考虑过为Car和Plane创建父类型,类似于可以投射到两个类的Vehicle类?您的车辆类别中的一个字段将是_date。因此,代码是这样的:

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

这样,你保留编译时类型的安全性&有一个更合乎逻辑的类型层次,因为所有列的两个表中同你不应该有代表他们的任何困难作为车辆。

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); 

但我与克里斯同意:一个共同的父类是干净多了。

相关问题