冲突 OData 与存储库模式

Conflict OData with Repository pattern

我的存储库中有方法 GetByID return 通用类型:

 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,因为在我看来它更正确。

应该returnGetByID什么类型?你能告诉我该怎么做吗?

IQueryable 接口将过滤推迟到调用者,调用者可以在 "rendering" 最终列表之前进行进一步过滤(在 Entity Framework 中这意味着执行实际查询,同时应用所有 WHERE 参数) .

所以 SingleResult 需要一个 IQueryable 来添加任何进一步的过滤。

如果 this.Entities 是一个 EF 集合 (DBSet),您可以使用 .Where(o => o.Id == id) 这将 return 一个 IQueryable 对象。

如果让存储库 class return 成为 IQueryable 是一种好的做法,那么您的问题更多是设计问题。我会说这取决于您的解决方案的总体设计以及您分配给哪一层的职责。

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