我这样问了这个问题,因为我可以想象这是一个可能很容易但Devart特定的解决方案,但对于任何类似情况来说也许是一个非常通用的解决方案。
我使用Devart LINQ To Oracle,通常在设计时在lqml文件中创建类似ItemX
的类,并指定它背后的表。然后,在运行时,使用Table(Of ItemX)
来查询数据库。到目前为止一切都很好。
现在我遇到了两个相同的表ItemX
和ItemY
的情况,我需要根据运行时标志从一个或另一个查询。除此之外,所有代码都是相同的,我想保持这种方式。但是,Table(Of ItemX)
是强类型的,因此我需要拥有所有内容的重复版本,唯一的区别是数据类型。
因此,Devart特定的解决方案是:只有一个项类叫做Item
,但是在运行时做一些事情,以便Devart DataContext使用不同的支持表。然后,所有代码都使用基本Item
对象,但是当持久进出数据库时,它知道要使用哪个表。有没有办法做到这一点?
更通用的方法是将某些方法连接到IQueryable链,以便它在内部使用ItemX
和ItemY
类,但将所有内容转换为基类Item
类。外部签名。我甚至无法清楚地想象出这个问题。有没有办法实现这个目标?
答案 0 :(得分:0)
您可以通过手动创建基类(未映射到任何表)和两个“平凡”后代(每个映射到您使用的其中一个表)来实现此方案。
更准确地说,应该执行以下步骤:
因此,这看起来应该是
namespace MyContext {
public partial class ItemBase : INotifyPropertyChanging, INotifyPropertyChanged {
... // Generated code.
}
[Table(Name = @"ItemXs")]
public partial class ItemX : ItemBase {}
[Table(Name = @"ItemYs")]
public partial class ItemY : ItemBase {}
public partial class MyDataContext {
public Devart.Data.Linq.Table<ItemX > ItemXs {
get { return this.GetTable<ItemX>(); }
}
public Devart.Data.Linq.Table<ItemY> ItemYs {
get { return this.GetTable<ItemY>(); }
}
}
}