0

ここでの私の目的は、パターン戦略を適用することです。そのために、すべてのデータベース要求を行い、それらの呼び出しを使用するクラスを「展開」します。

new DBRequest1().Exec();
new DbRequest2(id).Exec();

DBRequest クラスは次のようになります。

interface IDBRequest
{
    TR Exec<TR, TD>() where TR : IEnumerable<TD>, IQueryable<TD>;
}

class DBRequest1 : IDBRequestDB
{
  public DBRequest1(){ } //constructor
  public TR Exec<TR, TD>() where TR : IEnumerable<TD>, IQueryable<TD> {
    return Enumerable.Empty<Models.Table1Element>();
  }
}

class DBRequest2 : IDBRequestDB
{
  private int Id{get;set;}
  public DBRequest2(in id){ Id = id; } //constructor
  public TR Exec<TR, TD>() where TR : IEnumerable<TD>, IQueryable<TD> {
    return MY_DATABASE.Table2.Where(r=>r.id == Id);
  }
}

明らかにこれは機能していません。私は使用できます

IEnumerable<object> Exec();

すべての要素をオブジェクトにキャストしますが、使用するのは非常に面倒です... Exec() が IEnumerable、IQueryable を返すことができるようにするには、メソッドのシグネチャ/ボディをどのように設定すればよいですか? それは可能ですか?

4

1 に答える 1

0

実際には、遺伝的パラメーターは 1 つだけです。それは TD です。メソッドに「IQueryable または IEnumerable」の戻り値の型を指定することはできないため、使用するインターフェイスを 1 つ選択する必要があります。

interface IDBRequest<T>
{
    IEnumerable<T> Exec();
}

class DBRequest1 : IDBRequest<Models.Table1Element>
{
    public IEnumerable<Models.Table1Element> Exec()
    {
        return Enumerable.Empty<Models.Table1Element>();
    }
}

class DBRequest2 : IDBRequest<Models.Table1Element>
{
    public IEnumerable<Models.Table1Element> Exec()
    {
        // fetch from DB
        return MY_DATABASE.Table2.Where(r=>r.id == Id);
    }
}

または、IQueryable の場合:

interface IDBRequest<T>
{
    IQueryable<T> Exec();
}

class DBRequest1 : IDBRequest<Models.Table1Element>
{
    public IQueryable<Models.Table1Element> Exec()
    {
        return Enumerable.Empty<Models.Table1Element>().AsQueryable();
    }
}

class DBRequest2 : IDBRequest<Models.Table1Element>
{
    public IQueryable<Models.Table1Element> Exec()
    {
        // fetch from DB
        return MY_DATABASE.Table2.Where(r=>r.id == Id);
    }
}
于 2013-11-08T08:20:47.907 に答える