gpt4 book ai didi

entity-framework - Entity Framework 存储库模式为什么不返回 Iqueryable?

转载 作者:行者123 更新时间:2023-12-04 07:35:37 24 4
gpt4 key购买 nike

关于如何使用泛型类实现存储库模式和工作单元模式有几个很好的博客。

Implementing a Data Access Layer with Entity Framework 6.1

Implementing the Repository and Unit of Work Patterns

想法是,定义一个通用接口(interface) IRepository 和一个隐藏数据实际访问方式的类 Repository。可以使用 Entity Framework DbContext 访问它,或者存储库可能是用于单元测试的内存集合。

public interface public interface IRepository<T> where T : class
{
T GetById(int Id);
void DeleteById(int Id);

void Add(T entity);
void Update(T entity);

etc.
}

我经常看到添加了几个类似于 Queryable 和/或 Enumerable 函数的 Query 函数。

例如 Implementing a data access layer我懂了:
/// Returns an IEnumerable based on the query, order clause and the properties included
/// <param name="query">Link query for filtering.</param>
/// <param name="orderBy">Link query for sorting.</param>
/// <param name="includeProperties">Navigation properties seperated by comma for eager loading.</param>
/// <returns>IEnumerable containing the resulting entity set.</returns>
IEnumerable<T> GetByQuery(Expression<Func<T, bool>> query = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = "");

/// <summary>
/// Returns the first matching entity based on the query.
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
T GetFirst(Expression<Func<T, bool>> predicate);

如果接口(interface)有一个函数 IQueryable GetQuery(),那么我就不必编写 GetFirst() 和 GetByQuery() 之类的函数了。

Question: Why is this not recommended? Can people change the data in an undesirable way?

最佳答案

不建议这样做,因为它会使存储库模式无效。
此模式的目的是通过抽象的方式使您的 DAL 实现与您的其他项目分开。

本质上,返回 IQueryable 将返回 TSQL 语句而不是结果,这意味着任何引用您的 DAL 的项目都需要对 EF 的额外引用才能执行查询。这种“数据泄漏”将使您的项目更加紧密,因此与关注点分离原则相矛盾。

您可以在此处阅读有关存储库模式及其好处的更多信息:
http://www.codeproject.com/Articles/526874/Repositorypluspattern-cplusdoneplusright

关于entity-framework - Entity Framework 存储库模式为什么不返回 Iqueryable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33755499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com