パーティーには少し遅れましたが、これを行う別の方法がまだあります。データベース テーブルに格納しているバリアント "タイプ" ごとに個別の LINQ テーブル クラスを作成することができます。これにより、挿入操作を実行できます。例えば;
[Table(Name = "tVariant")]
public class tVariantDouble
{
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public int variantID { get; set; }
[Column(CanBeNull = true)]
public double? myVariant { get; set; }
[Column(CanBeNull = true)]
public string name { get; set; }
[Column(CanBeNull = false)]
public int typeID { get; set; }
public tVariantDouble() { typeID = 1; }
};
[Table(Name = "tVariant")]
public class tVariantInteger
{
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public int variantID { get; set; }
[Column(CanBeNull = true)]
public int? myVariant { get; set; }
[Column(CanBeNull = true)]
public string name { get; set; }
[Column(CanBeNull = false)]
public int typeID { get; set; }
public tVariantInteger() { typeID = 2; }
};
これらのクラスを使用すると、従来の LINQ-to-SQL メソッドに挿入できます。また、挿入時に typeID を一意の値に設定します。これは、LINQ where ステートメントを使用して、適切な型のデータを再度選択するのに役立ちます。
同じテーブルの基本テンプレート クラスを作成することをお勧めしますが、LINQ はせいぜい継承が不格好であり、単に機能しません。
この方法は多少の重複を引き起こしますが、それでもこれを達成するための非常にきちんとした方法であり、他の提案された方法よりも欠点が少なくなります。
バリアント型に関係なく、テーブルからすべてのデータを選択したい場合は、ユニオン演算子を別の中間クラスと共に使用して、すべての結果を結合することをお勧めします。