1

だから私は単純なプロジェクト管理システムをやっていて、LINQ の問題に遭遇しました。これはおそらく一般的です。プロジェクト タスクはテンプレートに基づいています (データベース内のタスクとテーブルを共有します)。プロジェクト タスクには、値がない限り、既定でタスク テンプレートから継承されるいくつかのフィールドがあります。たとえば、UnitPrice が 0 の ProjectTask レコードは、ProjectTask テンプレート レコードを参照して実際の価格を取得します。

これを LINQ で実装するにはどうすればよいですか? ObjectDataSource を実行することを考えましたが、それは他のすべてのデータ (LINQ で) を実行する方法から離れています。以下のようなコードで派生クラスを作ってみたのですが、ORMデザイナーで継承を設定してもLinqDataSourceに表示されません。

グーグルで調べましたが、良いモデルが見つからないようです。何かご意見は?いつもありがとう。

public class ProjectTaskWithInheritance : ProjectTask
{
    public new decimal UnitPrice
    {
        get
        {
            if (IsServiceOverride)
                if (base.UnitPrice != 0)
                    return base.UnitPrice;

            return base.TaskTemplateRecord.UnitPrice;
        }
        set { base.UnitPrice = value; }
    }
}
4

1 に答える 1

2

継承のレベルを混同しています。システムは、互いに継承するものをモデル化します (つまり、プロジェクト タスクUnitPriceはプロジェクト タスク テンプレートから継承します)。同時に、.NET プログラムで継承を使用してモデル化しようとしています。これらは 2 つの異なる継承です。1 つはデータ層にあり、もう 1 つはコード層にあります。

継承を使用するのではなく、コード層に含まれるデータ層で継承をモデル化することをお勧めします。それぞれに、タスク テンプレートとして機能ProjectTaskする のオプションのインスタンスを含めることができます。ProjectTaskタスク自体にプロパティが見つからない場合は、テンプレートオブジェクトで検索してみてください。オブジェクトまたはそのテンプレートでプロパティが設定されていない場合に備えて、プロパティを null 可能にします。

class ProjectTask {
    private ProjectTask Template {get;set;}
    private decimal? unitPriceOverride;
    public decimal UnitPrice {
         get {
             return unitPriceOverride ?? (Template != null ? Template.UnitPrice : null);
         }
         set {
             unitPriceOverride = value;
         }
    }
}
于 2012-12-20T16:50:50.440 に答える