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

ray*_*n54 5 .net c# generics

我正在阅读通用存储库.我一直磕磕绊绊地看着一些我不理解的代码.我不知道他们是否有特定的名字.

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

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:我问的问题要比回答的问题简单得多.我想知道的是" 为了研究上述代码,我可以使用哪些搜索词?"

cas*_*One 9

请注意,所有这些都是基于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>,扩展的方法,诸如如何ThenByThenByDescending后才能调用弹出OrderByOrderByDescending; 这些扩展方法仅定义在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>未返回,它表示它不信任客户端不进行低效的数据库调用(这是一个有效的问题).

  • 我应该注意到,我认为所讨论的方法肯定是一种阻碍; 它真的很难使用Entity Framework.您理想情况下应该访问`IQueryable <T>`(使用一些基本过滤器/排序设置)并让调用者自己实现列表,可选地在执行之前附加一些额外的查询逻辑/操作. (3认同)
  • @ user2146821如果你不明白这个答案,这是非常清楚和一个很好的细分,你有一些基础研究要做. (2认同)