这叫什么,它有什么作用?(通用存储库的一部分)
本文关键字:什么 存储 一部分 作用 | 更新日期: 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
属性Age
的 Person
类,您可以使用以下内容筛选出 30 年或更早的IQueryable<Person>
返回的任何Person
:
p => p.Age > 30
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy
这只是一个委托,如果提供,将允许您设置订单。 假设您希望按年龄排序Person
实例,您将使用:
q => q.OrderBy(p => p.Age)
这是因为返回类型是 IOrderedQueryable<T>
,例如 ThenBy
和 ThenByDescending
等扩展方法只有在你调用 OrderBy
和 OrderByDescending
后才会弹出;这些扩展方法只在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>
,因此表示它不信任客户端不会进行低效的数据库调用(这是一个有效的问题)。