【问题标题】:Is there any way to set the TableAttribute at runtime, OR any way to do LINQ type switching at runtime?有什么方法可以在运行时设置 TableAttribute,或者有什么方法可以在运行时进行 LINQ 类型切换?
【发布时间】:2012-02-08 13:21:16
【问题描述】:

我这样问这个问题是因为我可以想象有一个潜在的简单但 Devart 特定的解决方案,但对于任何类似情况也可能是一个非常通用的解决方案。

我正在使用 Devart LINQ To Oracle,通常您在设计时在 lqml 文件中创建一个类似 ItemX 的类,并指定它后面的表。然后,在运行时,您使用Table(Of ItemX) 来查询数据库。到目前为止一切顺利。

现在我有两个相同的表ItemXItemY,我需要根据运行时标志从一个或另一个查询。除此之外,所有代码都是相同的,我想保持这种方式。但是,Table(Of ItemX) 是强类型的,因此我需要所有内容的重复版本,唯一的区别是数据类型。

因此,Devart 特定的解决方案是:拥有一个名为 Item 的项目类,但在运行时执行一些操作,以便 Devart DataContext 使用不同的后备表。然后所有代码都使用基本的Item 对象,但是当持久化到数据库和从数据库持久化时,它知道要使用哪个表。有没有办法做到这一点?

更通用的方法是挂接到 IQueryable 链中,以便它在内部使用 ItemXItemY 类,但在外部签名中将所有内容转换为基本 Item 类。我什至无法清楚地描述这个问题。有没有办法做到这一点?

【问题讨论】:

  • 如果它们的内容在类型和含义上都可以互换,那为什么还要有两张表呢?
  • 我要跟踪两种文档,每种类型的数据结构和逻辑都是相同的,但有时他们希望查看类型 X 的列表,有时希望查看类型 Y。你可以正在考虑应该有一个带有 DocumentType 列的表来保持文档类型分开,你可能是对的。但是,很久以前就这样做了,当时两个相似的系统合并了,现在以这种方式重整会非常非常混乱。

标签: .net clr iqueryable devart


【解决方案1】:

您可以通过手动创建一个基类(未映射到任何表)和它的两个“平凡”后代(每个都映射到您使用的表之一)来实现此场景。

更准确地说,应该执行以下步骤:

  • 生成模型,实体类对应任一表;
  • 将此实体类从生成的代码中移到其他地方;
  • 从该类中移除 Table 属性;
  • (可选)将类重命名为,例如,“ItemBase”;
  • 声明该类的两个公共后代(例如,“ItemX”和“ItemY”);
  • 将 Table 属性设置为指向每个后代的正确表;
  • 删除 DataContext 类的“ItemBases”属性(返回 Devart.Data.Linq.Table 对象的属性;当然,它可能有其他名称)并添加返回 Table 和 Table 的类似属性。

因此,这应该看起来像

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多