冲突OData与存储库模式

时间:2015-09-23 20:24:19

标签: c# asp.net-mvc asp.net-web-api odata repository-pattern

我的存储库中有方法GetByID,返回泛型类型:

 public T GetById(object id)
 {
    return this.Entities.Find(id);
 }

我将使用OData过滤数据,为此(当我使用$expand进行单行时)我需要这样的内容:

SingleResult.Create(repository.GetByID(id));

但当然我收到了错误,因为SingleResult需要输入IQueryable<T>

我该如何实施?

一个糟糕的解决方案是将我的GetByID更改为:

public IQueryable<T> GetById(object id)
{
    return this.Entities.FirstOrDefault(p => p.ID == (int)id);
}

但我更喜欢使用T GetById,因为在我看来这更正确。

应该返回哪种类型GetByID?你能告诉我该怎么办?

1 个答案:

答案 0 :(得分:2)

IQueryable接口将过滤推迟到调用者,调用者可以在“呈现”最终列表之前进行进一步过滤(在实体框架中,这意味着执行实际查询,同时应用所有WHERE参数)。

因此SingleResult需要IQueryable来添加任何进一步的过滤。

如果this.Entities是一个EF集合(DBSet),你可以使用.Where(o =&gt; o.Id == id)返回一个IQueryable对象。

如果让Repository类返回IQueryable是一个好习惯,那么你的问题更多的是设计问题。我会说这取决于您的解决方案的一般设计以及您分配给哪一层的责任。

通过查看这个答案(OData $expand, DTOs, and Entity Framework),如果ODataController期望[Queryable]方法的IQueryable返回类型,那么存储库返回IQueryable是完全没问题的。