我正在阅读通用存储库.我一直磕磕绊绊地看着一些我不理解的代码.我不知道他们是否有特定的名字.
这是我见过的最复杂的例子:
IEnumerable<T> GetByQuery(
Expression<Func<T, bool>> query = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderby = null,
string includeProperties = "");
Run Code Online (Sandbox Code Playgroud)
我知道它(无论它是什么)显然会返回一个IEnumerable,但我不知道如何阅读那些混乱的gobbledygook,更不用说如何使用它了.
编辑:我更感兴趣的是知道这是一个例子而不是特定例子的细分.在找到解释语法的东西之前,我需要知道它们被调用了什么.LINQ?
编辑2:我问的问题要比回答的问题简单得多.我想知道的是" 为了研究上述代码,我可以使用哪些搜索词?"
请注意,所有这些都是基于IQueryable<T>工作方式的极其有根据的猜测.
将其分为三个部分:
Expression<Func<T, bool>> query = null
Run Code Online (Sandbox Code Playgroud)
这是一个where子句,它与传递给Where扩展方法的签名相同IQueryable<T>.
你传递一个表达式,它在代码中表示的方式与lambda相同; C#编译器知道该参数正在查找Expression并将其编译为表达式树而不是委托.
例如,假设T是一个Person具有int属性的类Age,您可以使用以下内容过滤掉30年或更早的Person返回值IQueryable<Person>:
p => p.Age > 30
Run Code Online (Sandbox Code Playgroud)
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy
Run Code Online (Sandbox Code Playgroud)
这只是一个代表,如果提供,将允许您设置订单.假设您希望Person按年龄排序实例,您可以使用:
q => q.OrderBy(p => p.Age)
Run Code Online (Sandbox Code Playgroud)
这是因为返回类型IOrderedQueryable<T>,扩展的方法,诸如如何ThenBy与ThenByDescending后才能调用弹出OrderBy和OrderByDescending; 这些扩展方法仅定义在IOrderedQueryable<T>(它只是一个标记接口).
includeProperties
Run Code Online (Sandbox Code Playgroud)
这表明它正在使用幕后的实体框架.当您调用Include实体框架时,它允许您获取相关实体(通过外键)并加载与查询中返回的实体相关的实体.
假设Person该类具有Father类型的属性Person.如果您想查询Person实例并且还Father返回了属性,那么您将调用Include("Father")以指示Entity Framework不仅应该获取实例Person,而且还应该解决该Father关系.
IEnumerable<T> 返回类型
这将返回,以便您无权访问IQueryable<T>实例并强制您实现结果集(当您遍历它时).
执行此操作的实现应该返回一个物化列表(IReadOnlyCollection<T>),或者不仅仅是(假设)一个强制IQueryable<T>转换的东西IEnumerable<T>.
这也表明了该方法的作者对客户的信任; 因为IQueryable<T>未返回,它表示它不信任客户端不进行低效的数据库调用(这是一个有效的问题).