我正在阅读泛型存储库。我总是跌跌撞撞地陷入一些我不明白的代码中。我不知道他们有没有具体的名字。
这是我见过的最复杂的例子:
IEnumerable<T> GetByQuery(
Expression<Func<T, bool>> query = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderby = null,
string includeProperties = "");我知道它(不管它是什么)显然返回一个IEnumerable,但我不知道如何阅读这一混乱的混乱,更不用说如何使用它。
编辑:我更感兴趣的是知道什么是 of 的示例,而不是这个特定示例的细分。我需要知道它们的名称,然后才能找到解释语法的东西。林克??
编辑2:我问的问题比被回答的问题要简单得多。我只想知道“我可以用几个搜索词来研究上面的代码?”
发布于 2015-06-14 03:09:43
注意,所有这些都是基于IQueryable<T>是如何工作的,这是一个非常有教养的猜测。
把它分成三部分:
Expression<Func<T, bool>> query = null这是where子句,它是传递给Where扩展方法在IQueryable<T>上的相同签名。
您将传递一个表达式,该表达式的代码表示方式与lambda相同;C#编译器知道该参数正在寻找一个Expression,并将其编译成表达式树而不是委托。
例如,假设T是一个具有int属性Age的Person类,则可以筛选出由IQueryable<Person>返回的任何30年或更长时间的Person,如下所示:
p => p.Age > 30Func<IQueryable<T>, IOrderedQueryable<T>> orderBy这只是一个委托,如果提供,将允许您设置一个订单。假设您想要按年龄排序的Person实例,您可以使用:
q => q.OrderBy(p => p.Age)这是因为返回类型是IOrderedQueryable<T>,这种扩展方法(如ThenBy和ThenByDescending )是在调用OrderBy和OrderByDescending之后才弹出的;这些扩展方法只定义在IOrderedQueryable<T>上(它只不过是一个标记接口)。
includeProperties这表明它使用的是封面下的实体框架( Entity )。在实体框架中调用Include时,它允许您获取相关实体(通过外键)并加载与查询中返回的实体相关的实体。
假设Person类具有一个类型为Person的属性Father。如果您想查询Person实例并返回Father属性,那么您将调用Include("Father")来指示不仅实体框架应该获得Person的实例,而且它还应该解决Father关系。
IEnumerable<T>返回类型
这将被返回,这样您就无法访问IQueryable<T>实例,并强制您将结果集具体化(当您迭代它时)。
这样做的实现应该是返回一个物化列表(IReadOnlyCollection<T>),或者不只是(间接地)将IQueryable<T>转换为IEnumerable<T>。
它也表明了方法编写者对客户端的信任;由于没有返回IQueryable<T>,它表明它不信任客户端不进行低效的数据库调用(这是一个有效的关注点)。
https://stackoverflow.com/questions/30825574
复制相似问题