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,其中 TD 仅由 linQ 结果决定?只有可能吗?

4

1 回答 1

0

实际上你只有一个遗传参数——TD。无法为该方法指定“IQueryable 或 IEnumerable”返回类型,因此您应该选择一个接口来使用:

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 回答