首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这叫什么?它是做什么的?(通用储存库的一部分)

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

Stack Overflow用户
提问于 2015-06-14 02:58:38
回答 1查看 148关注 0票数 5

我正在阅读泛型存储库。我总是跌跌撞撞地陷入一些我不明白的代码中。我不知道他们有没有具体的名字。

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

代码语言:javascript
复制
IEnumerable<T> GetByQuery(
    Expression<Func<T, bool>> query = null, 
    Func<IQueryable<T>, IOrderedQueryable<T>> orderby = null, 
    string includeProperties = "");

我知道它(不管它是什么)显然返回一个IEnumerable,但我不知道如何阅读这一混乱的混乱,更不用说如何使用它。

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

编辑2:我问的问题比被回答的问题要简单得多。我只想知道“我可以用几个搜索词来研究上面的代码?”

EN

回答 1

Stack Overflow用户

发布于 2015-06-14 03:09:43

注意,所有这些都是基于IQueryable<T>是如何工作的,这是一个非常有教养的猜测。

把它分成三部分:

代码语言:javascript
复制
Expression<Func<T, bool>> query = null

这是where子句,它是传递给Where扩展方法在IQueryable<T>上的相同签名。

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

例如,假设T是一个具有int属性AgePerson类,则可以筛选出由IQueryable<Person>返回的任何30年或更长时间的Person,如下所示:

代码语言:javascript
复制
p => p.Age > 30
代码语言:javascript
复制
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy

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

代码语言:javascript
复制
q => q.OrderBy(p => p.Age)

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

代码语言:javascript
复制
includeProperties

这表明它使用的是封面下的实体框架( Entity )。在实体框架中调用Include时,它允许您获取相关实体(通过外键)并加载与查询中返回的实体相关的实体。

假设Person类具有一个类型为Person的属性Father。如果您想查询Person实例并返回Father属性,那么您将调用Include("Father")来指示不仅实体框架应该获得Person的实例,而且它还应该解决Father关系。

IEnumerable<T>返回类型

这将被返回,这样您就无法访问IQueryable<T>实例,并强制您将结果集具体化(当您迭代它时)。

这样做的实现应该是返回一个物化列表(IReadOnlyCollection<T>),或者不只是(间接地)将IQueryable<T>转换为IEnumerable<T>

它也表明了方法编写者对客户端的信任;由于没有返回IQueryable<T>,它表明它不信任客户端不进行低效的数据库调用(这是一个有效的关注点)。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30825574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档