我正在阅读通用存储库。我不断地陷入一些我不理解的代码中。我不知道它们是否有特定的名称。
这是我见过的最复杂的例子:
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
并将其编译成表达式树而不是委托(delegate)。
例如,假设 T
是 Person
类 int
属性(property)Age
,您可以过滤掉任何 Person
由 IQueryable<Person>
返回年满 30 岁且具有以下特征:
p => p.Age > 30
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy
这只是一个委托(delegate),如果提供,将允许您设置订单。假设你想要 Person
按年龄排序的实例,您将使用:
q => q.OrderBy(p => p.Age)
这是因为返回类型是IOrderedQueryable<T>
,这如何扩展方法如ThenBy
和 ThenByDescending
仅在您调用 OrderBy
后弹出和 OrderByDescending
;这些扩展方法仅在 IOrderedQueryable<T>
上定义(它只不过是一个标记界面)。
includeProperties
这表明它在幕后使用 Entity Framework 。当您调用 Include
在 Entity Framework 中,它允许您获取相关实体(通过外键)并加载与查询中返回的实体相关的实体。
假设 Person
类有一个属性 Father
类型 Person
.如果你想查询Person
实例并具有 Father
属性也返回,那么你会调用 Include("Father")
表明 Entity Framework 不仅应该获取 Person
的实例, 但它应该解决 Father
关系也是如此。
IEnumerable<T>
返回类型
这是返回的,因此您无权访问 IQueryable<T>
实例并强制您具体化结果集(当您遍历它时)。
执行此操作的实现应该返回物化列表 ( IReadOnlyCollection<T>
),或者不只是(假设)转换为 IQueryable<T>
的东西至 IEnumerable<T>
.
这也表明方法的编写者对客户的信任;作为IQueryable<T>
未返回,它表示它不信任客户端不会进行低效的数据库调用(这是一个有效的问题)。
关于c# - 这叫什么,它有什么作用? (通用存储库的一部分),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30825574/