0

単一テーブルの継承で汎用サポートを使用し、基本クラスの FindAll を引き続き使用することは可能ですか?

おまけの質問として、ActiveRecordLinqBase<> も使用できますか? 私はそれらのクエリが大好きです。

詳細: 次のクラスが定義されているとします。

public interface ICompany
{
    int ID { get; set; }
    string Name { get; set; }
}

[ActiveRecord("companies", 
  DiscriminatorColumn="type", 
  DiscriminatorType="String", 
  DiscriminatorValue="NA")]
public abstract class Company<T> : ActiveRecordBase<T>, ICompany
{
    [PrimaryKey]
    private int Id { get; set; }

    [Property]
    public String Name { get; set; }
}

[ActiveRecord(DiscriminatorValue="firm")]
public class Firm : Company<Firm>
{
    [Property]
    public string Description { get; set; }
}

[ActiveRecord(DiscriminatorValue="client")]
public class Client : Company<Client>
{
    [Property]
    public int ChargeRate { get; set; } 
}

これは、ほとんどの場合にうまく機能します。次のようなことができます。

var x = Client.FindAll();

しかし、時々私はすべての会社が欲しいです。ジェネリックを使用していない場合は、次のことができます。

var x = (Company[]) FindAll(Company);
Client a = (Client)x[0];
Firm b = (Firm)x[1];

それぞれの型に型キャストできる ICompany の配列を返す FindAll を記述する方法はありますか?
何かのようなもの:

var x = (ICompany[]) FindAll(Company<ICompany>);
Client a = (Client)x[0];

それとも、一般的なサポートをすべて間違って実装しようとしているのでしょうか?

4

1 に答える 1

0

これはどう:

[ActiveRecord("companies", 
  DiscriminatorColumn="type", 
  DiscriminatorType="String", 
  DiscriminatorValue="NA")]
public abstract class Company : ActiveRecordBase<Company>, ICompany {
    [PrimaryKey]
    private virtual int Id { get; set; }

    [Property]
    public virtual String Name { get; set; }
}

[ActiveRecord(DiscriminatorValue="firm")]
public class Firm : Company {
    [Property]
    public virtual string Description { get; set; }
}

[ActiveRecord(DiscriminatorValue="client")]
public class Client : Company {
    [Property]
    public virtual int ChargeRate { get; set; } 
}

var allClients = ActiveRecordMediator<Client>.FindAll();
var allCompanies = ActiveRecordMediator<Company>.FindAll(); // Gets all Companies (Firms and Clients). Same as Company.FindAll();

会社をクライアントまたは会社として単にダウンキャストすることはできないことに注意してください。適切なポリモーフィズムまたは訪問者を使用する必要があります。説明については、これを参照してください。

于 2010-05-05T19:57:15.233 に答える