这叫什么,它有什么作用?(通用存储库的一部分)

本文关键字:什么 存储 一部分 作用 | 更新日期: 2023-09-27 17:56:09

我正在阅读通用存储库。我一直绊倒一些我不理解的代码。我不知道他们是否有一个具体的名字。

这是我见过的最复杂的例子:

IEnumerable<T> GetByQuery(
    Expression<Func<T, bool>> query = null, 
    Func<IQueryable<T>, IOrderedQueryable<T>> orderby = null, 
    string includeProperties = "");

我知道它(不管它是什么)显然返回了一个IEnumerable,但我不知道如何阅读那些乱七八糟的东西,更不用说如何使用它了。

编辑:我更感兴趣的是知道这是一个示例而不是该特定示例的细分。我需要知道它们叫什么,然后才能找到解释语法的东西。林克??

编辑2:我问的问题比被回答的问题简单得多。我想知道的是"我可以使用哪些搜索词来研究上面的代码?

这叫什么,它有什么作用?(通用存储库的一部分)

请注意

,所有这些都是基于IQueryable<T>工作方式的非常有根据的猜测。

将其分解为三个部分:

Expression<Func<T, bool>> query = null

这是一个 where 子句,它与传递给 Where 扩展方法的签名相同 IQueryable<T> .

您将传递一个表达式,该表达式在代码中的表示方式与 lambda 相同;C# 编译器知道参数正在查找Expression,并将其编译为表达式树而不是委托。

例如,假设 T 是具有 int 属性AgePerson 类,您可以使用以下内容筛选出 30 年或更早的IQueryable<Person>返回的任何Person

p => p.Age > 30

Func<IQueryable<T>, IOrderedQueryable<T>> orderBy

这只是一个委托,如果提供,将允许您设置订单。 假设您希望按年龄排序Person实例,您将使用:

q => q.OrderBy(p => p.Age)

这是因为返回类型是 IOrderedQueryable<T> ,例如 ThenByThenByDescending 等扩展方法只有在你调用 OrderByOrderByDescending 后才会弹出;这些扩展方法只在IOrderedQueryable<T>上定义(它只不过是一个标记接口)。


includeProperties

这说明它在幕后使用了实体框架。 在实体框架中调用Include时,它允许获取相关实体(通过外键)并加载与查询中返回的实体相关的实体。

假设 Person 类具有类型 Person 的属性Father。 如果要查询Person实例并返回 Father 属性,则需要调用 Include("Father") 以指示实体框架不仅应获取Person的实例,而且还应解析Father关系。


IEnumerable<T>返回类型

返回此值是为了您无权访问IQueryable<T>实例,并强制您具体化结果集(当您循环访问结果集时)。

这样做的实现应该是返回一个物化列表(IReadOnlyCollection<T>),或者不仅仅是(假设)对IEnumerable<T>IQueryable<T>强制转换的东西。

这也表明该方法的编写者对客户端的信任;由于未返回IQueryable<T>,因此表示它不信任客户端不会进行低效的数据库调用(这是一个有效的问题)。